Прогнозирование коэффициента извлечения золота
из золотосодержащей руды

Золотодобыча — одна из самых перспективных отраслей промышленности, поскольку имеет значительный потенциал для роста. В силу своей долговечности, устойчивости к коррозии, золото стало важнейшим элементом финансового рынка и крупнейшим источником инвестиций. Хранить его можно практически бесконечно, а ликвидность этого металла сохраняет своё многовековое постоянство.

Золото в природе встречается в виде самородного металла или в составе золотосодержащих минералов, в которых кроме золота могут содержаться серебро, медь, свинец, железо, ртуть, висмут, металлы платиновой группы и другие. Самородное золото никогда не бывает химически чистым и всегда cодержит примеси.

В мире россыпные месторождения, где золото находится в свободном виде, близки к исчерпанию, и основная часть золота на планете уже выделяется из руд.

Большая часть добываемых в настоящее время золотосодержащих руд относится к сульфидному типу руд, содержащих пирит (FeS), арсенопирит (FeAsS) и, в виде примесей, небольшие количества меди, реже свинца, сурьмы, теллура и других. Зёрна самородного золота в таких рудах могут быть покрыты плёнками породных минералов (пирита и арсенопирита) и не освобождаются даже при очень мелкой крупности помола, что существенно затрудняет его извлечение.

Выбранную из карьера или добытую в шахте руду отвозят на горно-обогатительный комбинат. Схемы и режимы переработки руд на комбинате существенно зависят от содержания золота и размеров его частиц, минерального состава руд, их разрушаемости, наличия или отсутствия примесей, осложняющих извлечение золота.

Обогащение руды — совокупность методов переработки природного минерального сырья, которое представляет собой естественную смесь ценных компонентов и пустой породы, с целью получения концентратов, существенно обогащенных одним или несколькими ценными компонентами. Обогащение руды осуществляется преимущественно механическими, а также термическими и химическими методами.

Типовые схемы переработки золотосодержащих руд включают в себя (в разном составе) набор технологических операций: дробления и измельчения, гравитационного или флотационного обогащения с выделением отвальных хвостов (отходов производства) и концентратов. Полученный флотоконцентрат отгружают на гидрометаллургический комбинат. Если технологической схемой горно-обогатительного комбината предусмотрено дальнейшее обогащение флотоконцентрата, то он поступает на стадию химического обогащения (например, цианидным выщелачиванием) для перевода золота в раствор, из которого его осаждают электролизом, и дальнейшей плавкой получают сплав Доре. Далее полученный сплав отгружается на аффинажный завод, где в процессе многократного плавления и последующей кристаллизации осуществляется окончательная очистка металла.

Поведение зёрен самородного золота и золотосодержащих минералов в процессах обогащения зависит от их состава и вкраплённости. В зависимости от крупности самородное золото классифицируют на крупное (более 2 мм), мелкое (0,05–2 мм), пылевидное (5–50 мкм) и тонкодисперсное (менее 5 мкм).

Крупновкраплённые золотосодержащие минералы, а также крупное и мелкое самородное золото хорошо извлекаются с помощью гравитационных процессов, но плохо флотируются и медленно цианируются. Пылевидное и частично мелкое золото плохо извлекается с помощью гравитационных процессов, но хорошо флотируется и хорошо цианируется. Тонкодисперсное золото плохо извлекается не только гравитационными процессами, но и флотацией, если оно не связано с минералами-носителями. Такое золото вполне удовлетворительно извлекается только в результате гидрометаллургической обработки.

При мелком и неравномерном вкраплении золота лучшие результаты могут быть получены при обогащении с использованием многостадийных флотационных схем. Флотация как единственный процесс переработки руды предпочтительнее прямого цианирования исходной руды, если она обеспечивает высокую степень извлечения золота.

Флотация — процесс разделения тонкоизмельчённых частиц, применяемый для обогащения руд металлов, посредством воздушных пузырьков в пульпе, осуществляемый за счёт разницы в адгезии отдельных фракций сырья.

Применение флотации позволяет повысить комплексность использования руд с извлечением из них кроме золота других ценных компонентов (меди, серебра, свинца, барита, урана, селена, теллура и др.), а также позволяет удалить из руды вредные для последующего цианирования примесей таких, как сульфиды мышьяка, сурьмы, селена и теллура.

  1. Перед флотационным обогащением руду измельчают, для того чтобы каждая отдельная частица по возможности состояла из одних ценных минералов или пустой породы.

Чтобы отсечь пустую породу и отобрать как можно больше золотосодержащих частиц, пульпа (водная взвесь руды), перемалывается в барабанах в присутствии шаров из высокопрочной стали. Продукт измельчения отправляется на разделение крупных и мелких фракций. Самая тонкая пыль уходит на флотацию, крупная — на доизмельчение.

  1. При флотации разделение происходит в воде. В результате гидрофобного взаимодействия некоторые частицы твёрдого вещества находятся в несмачиваемом состоянии, а мелкие и тонкодисперсные частицы, кроме того, находятся во взвешенном состоянии (не оседают).

Сульфидные плёнки, окружающие золото, не смачиваются водой и находятся в пульпе во взвешенном состоянии. Это облегчает процесс флотации.

  1. Для эффективного разделения частиц через водную смесь пропускают воздух. Разделение осуществляется в результате прилипания некоторых твёрдых частиц к пузырькам газа, в то время как другие твёрдые частицы смачиваются водой и не прикрепляются к пузырькам, оставаясь в пульпе по-прежнему во взвешенном состоянии.

Продувание пульпы воздухом повышает производительность процесса флотационного обогащения. Эффективность флотации определяется оптимальными гидродинамическими условиями.

  1. Твёрдые частицы, прикрепившиеся к пузырькам воздуха, всплывают на поверхность пульпы, образуя пенный продукт, отличающийся по своему составу от исходной пульпы.

При флотационном обогащении золотосодержащих руд применяют смачиватели (например, высокомолекулярные спирты), которые могут увеличить адгезию пузырьков к частицам, содержащим золото. Для флотационного извлечения золота используются обычные при флотации сульфидов реагенты (ксантогенаты, аэрофлоты, сульфат меди и пенообразователи).

Депрессанты — вещества, избирательно подавляющие флотируемость каких-либо минералов, содержащих целевой компонент, либо пустой породы. Депрессия легкофлотируемой пустой породы достигается загрузкой органических реагентов, таких как карбоксиметилцеллюлозы, поскольку крахмал при больших расходах подавляет флотацию золота. Силикат натрия также используется для подавления флотируемости шлама и его диспергирования.

  1. При применении флотации для обогащения руд выделяется продукт, не содержащий полезных минералов, называемый «хвостами», и концентраты, в которых сосредотачиваются извлекаемые металлы.

Пузырьки окружают сульфидные «капсулы» и поднимают их наверх. В результате флотации лёгкие золотосодержащие частички оказываются на поверхности пульпы. Ценная пена сливается и подвергается дальнейшей очистке. А руда, которая ещё осталась во флотационной машине («хвосты»), может поступать на доизмельчение и снова на флотацию.

Результатом всего многоэтапного процесса становится отжатый из пены твёрдый осадок, называемый флотоконцентратом. Концентраты в некоторых случаях могут быть использованы в качестве конечных готовых продуктов, но большей частью они требуют дальнейшей обработки (выщелачивания, плавки). Если флотоконцентрат не поступает на стадию химического обогащения, то его сушат в барабане, где концентрат доводится до стандартной влажности. Затем сухой концентрат отгружают на гидрометаллургический комбинат.

Промышленных способов стопроцентного извлечения золота из руды пока не существует. Однако, чтобы процесс обогащения был экономически выгодным, извлечение золота из руды должно быть максимальным. Показателем эффективности процесса обогащения является коэффициент извлечения золота.

Для того чтобы предприятие не было убыточным, важно по текущим показателям производства уметь прогнозировать коэффициент извлечения. С помощью машинного обучения можно построить модель, которая сможет предсказывать значение такого коэффициента.

Коэффициент извлечения золота рассчитывается по формуле:

$k = \frac{c_{выход} \times (c_{вход} - c_{отход})}{c_{вход} \times (c_{выход} - c_{отход})}$,

где $c_{вход}$ — содержание золота во входящем потоке на стадию,
$c_{выход}$ — содержание золота в выходящем со стадии потоке,
$c_{отход}$ — содержание золота в отвальных «хвостах» со стадии.

В нашем распоряжении находятся данные о параметрах сырья, полупродуктов и продуктов, вспомогательных веществ, а также физические значения параметров оборудования стадии флотации и двух стадий очистки, где также используется флотационное обогащение. Кроме того, в наборе данных присутствуют значения расчётных величин: предусмотренных технологическим процессом, а также значения двух коэффициентов извлечения золота — после стадии флотации и после всех стадий очистки.

Единицы величин неизвестны и носят условный характер. Однако для схожих физических величин их единицы также являются схожими, их размерность одинаковая.

Помимо набора данных, в котором содержатся все измеренные и рассчитанные значения, имеются также выделенные наборы данных для обучения и тестирования модели машинного обучения, сведения в них неполные, но все они содержатся в наборе данных со всеми значениями.

Цель проекта: построить модель, прогнозирующую коэффициент извлечения золота из руды.

Задачи проекта:

  • выполнить предобработку данных (при необходимости);
  • провести исследовательский анализ данных;
  • разбить данные на тренировочную и тестовую выборки;
  • выбрать алгоритмы и построить модели;
  • выбрать метрики качества моделей и оценить их значения.

Содержание

  • 1  Обзор данных
    • 1.1  Импорт библиотек и предварительные настройки
    • 1.2  Чтение файла и загрузка данных
    • 1.3  Общая характеристика набора данных
  • 2  Понимание данных
  • 3  Описание данных
    • 3.1  Дата и время
    • 3.2  Содержание металлов и солей в потоках
      • 3.2.1  Содержание серебра в потоках
      • 3.2.2  Содержание золота в потоках
      • 3.2.3  Содержание свинца в потоках
      • 3.2.4  Содержание солей других металлов в потоках
    • 3.3  Вспомогательные вещества
    • 3.4  Скорость потока и размер частиц
    • 3.5  Объём воздуха
    • 3.6  Уровень жидкости
    • 3.7  Расчётные величины
    • 3.8  Проверка правильности автоматического расчёта коэффициента извлечения
  • 4  Предобработка данных
    • 4.1  Обработка аномальных значений
    • 4.2  Обработка пропусков
  • 5  Исследовательский анализ данных
    • 5.1  Изменение содержания металлов в основном потоке
      • 5.1.1  Извлечение золота
      • 5.1.2  Извлечение серебра
      • 5.1.3  Извлечение свинца
    • 5.2  Изменение суммарного содержания металлов в основном потоке
    • 5.3  Изменение размеров гранул исходного сырья
  • 6  Построение моделей
    • 6.1  Разделение данных на выборки
      • 6.1.1  Выделение признаков для формирования тестовой и тренировочной выборок
      • 6.1.2  Выделение признаков, влияющих на прогноз значения коэффициента извлечения на стадии флотации
    • 6.2  Функция расчёта метрики качества моделей
    • 6.3  Обучение моделей
      • 6.3.1  Решающее дерево
      • 6.3.2  Случайный лес
      • 6.3.3  Линейная регрессия
    • 6.4  Оценка моделей
    • 6.5  Оценка адекватности моделей
  • 7  Общий вывод

Обзор данных¶

Импорт библиотек и предварительные настройки¶

In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import sys
import os

from sklearn.dummy import DummyRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error, make_scorer

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', 100)
np.set_printoptions(threshold=sys.maxsize)

RANDOM_STATE = 1

Чтение файлов и загрузка данных¶

Все данные хранятся в трёх файлах.
Файлы данных gold_industry_train.csv, gold_industry_test.csv, gold_industry_full.csv имеют формат CSV.

In [2]:
PATHS = [r'C:\Users\Георгий\Documents\DS_projects', '/datasets', '/content']

def read_df(name, paths=PATHS):
    '''
    Функция загрузки данных из CSV-файлов
    с проверкой существования пути к файлу.

    Принимает название файла.
    Возвращает набор данных из файла.
    '''

    for path in paths:
        file_path = os.path.join(path, name)
        if os.path.exists(file_path):
            df = pd.read_csv(file_path)

            return df

    print(f'{name}: Something is wrong')
In [3]:
train = read_df('gold_industry_train.csv')
test = read_df('gold_industry_test.csv')
full = read_df('gold_industry_full.csv')
In [4]:
data_dict = {'train': train,
             'test': test,
             'full': full}

Убедимся, что данные подгрузились верно, без ошибок.

Для этого выведем первые 2 строки и последние 2 строки наборов данных.

In [5]:
for name in data_dict:
    display(name)
    display(data_dict[name].head(2))
    display(data_dict[name].tail(2))
'train'
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate rougher.calculation.sulfate_to_au_concentrate rougher.calculation.floatbank10_sulfate_to_au_feed rougher.calculation.floatbank11_sulfate_to_au_feed rougher.calculation.au_pb_ratio rougher.output.concentrate_au rougher.output.concentrate_ag rougher.output.concentrate_pb rougher.output.concentrate_sol rougher.output.recovery rougher.output.tail_au rougher.output.tail_ag rougher.output.tail_pb rougher.output.tail_sol primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level primary_cleaner.output.concentrate_au primary_cleaner.output.concentrate_ag primary_cleaner.output.concentrate_pb primary_cleaner.output.concentrate_sol primary_cleaner.output.tail_au primary_cleaner.output.tail_ag primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level secondary_cleaner.output.tail_au secondary_cleaner.output.tail_ag secondary_cleaner.output.tail_pb secondary_cleaner.output.tail_sol final.output.concentrate_au final.output.concentrate_ag final.output.concentrate_pb final.output.concentrate_sol final.output.recovery final.output.tail_au final.output.tail_ag final.output.tail_pb final.output.tail_sol
0 2016-01-15 00:00:00 6.486150 6.100378 2.284912 36.808594 523.546326 55.486599 11.986616 6.007990 999.706909 -404.066986 1603.011353 -434.715027 1602.37500 -442.204468 1598.937256 -451.294128 1404.472046 -455.462982 1416.354980 -451.939636 11.836743 6.005818 41885.707031 3481.779053 3520.337158 2.838687 19.793808 11.500771 7.101074 28.029297 87.107763 1.170244 5.008018 0.508728 19.154297 127.092003 10.128295 7.25 0.988759 1549.775757 -498.912140 1551.434204 -516.403442 1549.873901 -498.666595 1554.367432 -493.428131 34.174427 8.547551 10.389648 19.529297 2.106679 14.936526 2.534912 7.476074 25.853109 -498.526489 23.89366 -501.406281 23.961798 -495.262817 21.940409 -499.340973 14.016835 -502.488007 12.099931 -504.715942 9.925633 -498.310211 8.079666 -500.470978 14.151341 -605.841980 2.606185 14.500184 4.694824 8.764648 42.192020 6.055403 9.889648 5.507324 70.541216 2.143149 10.411962 0.895447 16.904297
1 2016-01-15 01:00:00 6.478583 6.161113 2.266033 35.753385 525.290581 57.278666 11.971193 6.005766 1000.286398 -400.065196 1600.754587 -449.953435 1600.47958 -449.830646 1600.527589 -449.953649 1399.227084 -450.869848 1399.719514 -450.119001 11.996163 6.012594 42050.861809 3498.370979 3489.981857 2.858998 20.050975 11.615865 7.278807 28.067063 86.843261 1.184827 4.955378 0.536689 18.965234 125.629232 10.296251 7.25 1.002663 1576.166671 -500.904965 1575.950626 -499.865889 1575.994189 -499.315107 1574.479259 -498.931665 34.118526 8.558743 10.497069 19.369147 2.353017 16.250511 3.049646 6.733907 25.880539 -499.989656 23.88953 -500.372428 23.970550 -500.085473 22.085714 -499.446897 13.992281 -505.503262 11.950531 -501.331529 10.039245 -500.169983 7.984757 -500.582168 13.998353 -599.787184 2.488248 14.265474 4.592547 9.001494 42.701629 6.029369 9.968944 5.257781 69.266198 2.224930 10.462676 0.927452 16.634514
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate rougher.calculation.sulfate_to_au_concentrate rougher.calculation.floatbank10_sulfate_to_au_feed rougher.calculation.floatbank11_sulfate_to_au_feed rougher.calculation.au_pb_ratio rougher.output.concentrate_au rougher.output.concentrate_ag rougher.output.concentrate_pb rougher.output.concentrate_sol rougher.output.recovery rougher.output.tail_au rougher.output.tail_ag rougher.output.tail_pb rougher.output.tail_sol primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level primary_cleaner.output.concentrate_au primary_cleaner.output.concentrate_ag primary_cleaner.output.concentrate_pb primary_cleaner.output.concentrate_sol primary_cleaner.output.tail_au primary_cleaner.output.tail_ag primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level secondary_cleaner.output.tail_au secondary_cleaner.output.tail_ag secondary_cleaner.output.tail_pb secondary_cleaner.output.tail_sol final.output.concentrate_au final.output.concentrate_ag final.output.concentrate_pb final.output.concentrate_sol final.output.recovery final.output.tail_au final.output.tail_ag final.output.tail_pb final.output.tail_sol
14577 2017-12-09 12:59:59 4.838619 6.121323 4.144989 38.591551 559.031805 119.499241 7.356687 9.304952 1196.569267 -299.512227 1147.675196 -500.608341 1048.565741 -500.932810 949.773589 -500.023144 848.515225 -500.289405 850.013123 -496.822119 7.095508 9.297924 46200.099585 2614.403937 2518.550078 1.167342 18.441436 11.425983 10.888213 29.783972 87.724007 0.771582 4.177943 0.650557 16.960649 120.878188 7.962636 6.5 1.302419 1649.820162 -399.930973 1649.357538 -399.721222 1648.656192 -401.195834 1649.725133 -400.636306 32.925325 6.612376 12.623947 7.542264 2.462890 23.002490 6.629725 4.089124 35.026062 -499.891945 29.921795 -499.949663 26.031747 -500.384612 22.991058 -500.079590 22.960095 -501.612783 20.035660 -500.251357 17.998535 -500.395178 12.954048 -499.895163 19.968498 -501.041608 0.0 0.0 0.0 0.0 46.866780 3.195978 11.349355 6.862249 69.049291 1.612542 8.897321 3.130493 10.549470
14578 2017-12-09 13:59:59 4.525061 5.970515 4.020002 40.074026 555.682872 122.262690 6.586020 9.299606 1204.866639 -299.235675 1149.942902 -501.717903 1049.604390 -500.549053 952.702732 -502.352296 849.016017 -500.505677 850.455635 -506.897968 6.584130 9.300133 44585.181334 2510.813545 2510.142433 1.125637 15.111231 8.523497 8.955135 22.786467 88.890579 0.685059 4.050010 0.636095 18.323080 105.666118 7.955111 6.5 1.315926 1649.166761 -399.888631 1649.196904 -399.677571 1647.896999 -399.988275 1649.772714 -399.831902 31.856742 7.128896 12.633558 7.941900 2.612231 22.298149 6.278250 4.457457 35.003586 -501.083794 29.990533 -611.855898 25.948429 -500.067268 22.968268 -499.839442 23.015718 -501.711599 19.951231 -499.857027 18.019543 -500.451156 13.023431 -499.914391 19.990885 -501.518452 0.0 0.0 0.0 0.0 46.795691 3.109998 11.434366 6.886013 67.002189 1.596616 8.529606 2.911418 11.115147
'test'
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level
0 2017-12-09 14:59:59 4.365491 6.158718 3.875727 39.135119 555.820208 94.544358 6.146982 9.308612 1196.238112 -299.862743 1147.248241 -500.363165 1047.279065 -500.354091 948.756608 -498.439416 849.441918 -499.255503 850.112246 -499.407112 6.168939 9.309852 95.248427 8.078957 6.5 1.283045 1648.759906 -399.862053 1650.135395 -399.957321 1648.831890 -400.586116 1649.464582 -400.673303 34.940919 -500.150510 30.031867 -500.328335 26.033990 -500.147792 22.952306 -500.037678 23.018622 -500.492702 20.020205 -500.220296 17.963512 -499.939490 12.990306 -500.080993 19.990336 -499.191575
1 2017-12-09 15:59:59 4.362781 6.048130 3.902537 39.713906 544.731687 123.742430 6.210119 9.297709 1201.904177 -299.907308 1154.087804 -500.036580 1054.009756 -500.237335 944.138793 -496.866953 851.589767 -499.040466 851.345606 -499.122561 6.209517 9.297194 98.880538 7.984164 6.5 1.241969 1646.547763 -398.977083 1648.212240 -400.383265 1648.917387 -399.521344 1651.498591 -399.745329 34.980742 -498.131002 29.968453 -586.013330 25.971737 -499.608392 22.958448 -499.821308 23.024963 -501.153409 20.054122 -500.314711 17.979515 -499.272871 12.992404 -499.976268 20.013986 -500.625471
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level
4858 2018-08-18 09:59:59 6.702243 6.097592 2.278955 37.728375 549.812490 59.637037 13.746510 6.706417 999.635748 -399.484884 1599.852212 -449.448826 1599.325946 -448.812166 1614.612892 -449.774665 1401.626496 -447.607440 1400.158685 -448.035466 13.758277 6.702969 147.944885 12.481529 7.25 0.893913 1603.053015 -499.728573 1600.537532 -500.096021 1597.568005 -499.601040 1599.213513 -500.964698 26.111929 -499.496608 24.094419 -500.250900 23.945513 -500.816108 23.995434 -499.761541 13.983963 -503.675714 11.928745 -500.583183 9.970359 -498.822343 8.016377 -499.013145 14.000032 -600.024741
4859 2018-08-18 10:59:59 6.633002 5.908793 2.440899 36.958540 573.076049 58.509262 13.707775 6.820245 1000.589156 -398.879586 1598.975250 -451.238638 1600.058139 -451.271448 1610.182874 -450.460190 1399.194663 -450.332681 1399.638290 -450.198722 13.812674 6.790624 138.120409 12.464032 7.25 0.898779 1603.436598 -499.864400 1597.455353 -500.266905 1600.747882 -500.541002 1599.754053 -499.216962 26.059510 -499.151646 23.934570 -499.351758 23.994184 -500.078566 23.924481 -499.989024 13.989632 -503.195299 12.052233 -500.928547 9.962574 -502.986357 7.979219 -500.146835 13.981614 -598.070855
'full'
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate rougher.calculation.sulfate_to_au_concentrate rougher.calculation.floatbank10_sulfate_to_au_feed rougher.calculation.floatbank11_sulfate_to_au_feed rougher.calculation.au_pb_ratio rougher.output.concentrate_au rougher.output.concentrate_ag rougher.output.concentrate_pb rougher.output.concentrate_sol rougher.output.recovery rougher.output.tail_au rougher.output.tail_ag rougher.output.tail_pb rougher.output.tail_sol primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level primary_cleaner.output.concentrate_au primary_cleaner.output.concentrate_ag primary_cleaner.output.concentrate_pb primary_cleaner.output.concentrate_sol primary_cleaner.output.tail_au primary_cleaner.output.tail_ag primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level secondary_cleaner.output.tail_au secondary_cleaner.output.tail_ag secondary_cleaner.output.tail_pb secondary_cleaner.output.tail_sol final.output.concentrate_au final.output.concentrate_ag final.output.concentrate_pb final.output.concentrate_sol final.output.recovery final.output.tail_au final.output.tail_ag final.output.tail_pb final.output.tail_sol
0 2016-01-15 00:00:00 6.486150 6.100378 2.284912 36.808594 523.546326 55.486599 11.986616 6.007990 999.706909 -404.066986 1603.011353 -434.715027 1602.37500 -442.204468 1598.937256 -451.294128 1404.472046 -455.462982 1416.354980 -451.939636 11.836743 6.005818 41885.707031 3481.779053 3520.337158 2.838687 19.793808 11.500771 7.101074 28.029297 87.107763 1.170244 5.008018 0.508728 19.154297 127.092003 10.128295 7.25 0.988759 1549.775757 -498.912140 1551.434204 -516.403442 1549.873901 -498.666595 1554.367432 -493.428131 34.174427 8.547551 10.389648 19.529297 2.106679 14.936526 2.534912 7.476074 25.853109 -498.526489 23.89366 -501.406281 23.961798 -495.262817 21.940409 -499.340973 14.016835 -502.488007 12.099931 -504.715942 9.925633 -498.310211 8.079666 -500.470978 14.151341 -605.841980 2.606185 14.500184 4.694824 8.764648 42.192020 6.055403 9.889648 5.507324 70.541216 2.143149 10.411962 0.895447 16.904297
1 2016-01-15 01:00:00 6.478583 6.161113 2.266033 35.753385 525.290581 57.278666 11.971193 6.005766 1000.286398 -400.065196 1600.754587 -449.953435 1600.47958 -449.830646 1600.527589 -449.953649 1399.227084 -450.869848 1399.719514 -450.119001 11.996163 6.012594 42050.861809 3498.370979 3489.981857 2.858998 20.050975 11.615865 7.278807 28.067063 86.843261 1.184827 4.955378 0.536689 18.965234 125.629232 10.296251 7.25 1.002663 1576.166671 -500.904965 1575.950626 -499.865889 1575.994189 -499.315107 1574.479259 -498.931665 34.118526 8.558743 10.497069 19.369147 2.353017 16.250511 3.049646 6.733907 25.880539 -499.989656 23.88953 -500.372428 23.970550 -500.085473 22.085714 -499.446897 13.992281 -505.503262 11.950531 -501.331529 10.039245 -500.169983 7.984757 -500.582168 13.998353 -599.787184 2.488248 14.265474 4.592547 9.001494 42.701629 6.029369 9.968944 5.257781 69.266198 2.224930 10.462676 0.927452 16.634514
date rougher.input.feed_au rougher.input.feed_ag rougher.input.feed_pb rougher.input.feed_sol rougher.input.feed_rate rougher.input.feed_size rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate rougher.calculation.sulfate_to_au_concentrate rougher.calculation.floatbank10_sulfate_to_au_feed rougher.calculation.floatbank11_sulfate_to_au_feed rougher.calculation.au_pb_ratio rougher.output.concentrate_au rougher.output.concentrate_ag rougher.output.concentrate_pb rougher.output.concentrate_sol rougher.output.recovery rougher.output.tail_au rougher.output.tail_ag rougher.output.tail_pb rougher.output.tail_sol primary_cleaner.input.sulfate primary_cleaner.input.depressant primary_cleaner.input.feed_size primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air primary_cleaner.state.floatbank8_a_level primary_cleaner.state.floatbank8_b_air primary_cleaner.state.floatbank8_b_level primary_cleaner.state.floatbank8_c_air primary_cleaner.state.floatbank8_c_level primary_cleaner.state.floatbank8_d_air primary_cleaner.state.floatbank8_d_level primary_cleaner.output.concentrate_au primary_cleaner.output.concentrate_ag primary_cleaner.output.concentrate_pb primary_cleaner.output.concentrate_sol primary_cleaner.output.tail_au primary_cleaner.output.tail_ag primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol secondary_cleaner.state.floatbank2_a_air secondary_cleaner.state.floatbank2_a_level secondary_cleaner.state.floatbank2_b_air secondary_cleaner.state.floatbank2_b_level secondary_cleaner.state.floatbank3_a_air secondary_cleaner.state.floatbank3_a_level secondary_cleaner.state.floatbank3_b_air secondary_cleaner.state.floatbank3_b_level secondary_cleaner.state.floatbank4_a_air secondary_cleaner.state.floatbank4_a_level secondary_cleaner.state.floatbank4_b_air secondary_cleaner.state.floatbank4_b_level secondary_cleaner.state.floatbank5_a_air secondary_cleaner.state.floatbank5_a_level secondary_cleaner.state.floatbank5_b_air secondary_cleaner.state.floatbank5_b_level secondary_cleaner.state.floatbank6_a_air secondary_cleaner.state.floatbank6_a_level secondary_cleaner.output.tail_au secondary_cleaner.output.tail_ag secondary_cleaner.output.tail_pb secondary_cleaner.output.tail_sol final.output.concentrate_au final.output.concentrate_ag final.output.concentrate_pb final.output.concentrate_sol final.output.recovery final.output.tail_au final.output.tail_ag final.output.tail_pb final.output.tail_sol
19437 2018-08-18 09:59:59 6.702243 6.097592 2.278955 37.728375 549.812490 59.637037 13.746510 6.706417 999.635748 -399.484884 1599.852212 -449.448826 1599.325946 -448.812166 1614.612892 -449.774665 1401.626496 -447.607440 1400.158685 -448.035466 13.758277 6.702969 42019.291707 3502.637709 3495.776643 2.940927 19.620480 11.528770 7.091962 27.774855 89.299981 1.031923 4.559246 0.557099 20.067665 147.944885 12.481529 7.25 0.893913 1603.053015 -499.728573 1600.537532 -500.096021 1597.568005 -499.601040 1599.213513 -500.964698 28.081869 5.899284 8.154167 14.301345 1.874228 15.993499 3.077749 7.312664 26.111929 -499.496608 24.094419 -500.250900 23.945513 -500.816108 23.995434 -499.761541 13.983963 -503.675714 11.928745 -500.583183 9.970359 -498.822343 8.016377 -499.013145 14.000032 -600.024741 1.868321 13.795229 4.576720 9.876374 43.339714 5.664983 10.168953 5.484318 72.659046 2.064422 10.475957 1.050592 17.525656
19438 2018-08-18 10:59:59 6.633002 5.908793 2.440899 36.958540 573.076049 58.509262 13.707775 6.820245 1000.589156 -398.879586 1598.975250 -451.238638 1600.058139 -451.271448 1610.182874 -450.460190 1399.194663 -450.332681 1399.638290 -450.198722 13.812674 6.790624 41882.126352 3499.915439 3519.952954 2.717442 19.497669 11.116297 7.297363 27.497520 87.650868 1.167140 4.667157 0.615418 18.907179 138.120409 12.464032 7.25 0.898779 1603.436598 -499.864400 1597.455353 -500.266905 1600.747882 -500.541002 1599.754053 -499.216962 34.826500 8.098985 10.525324 18.436589 2.025454 15.535214 2.866688 7.265906 26.059510 -499.151646 23.934570 -499.351758 23.994184 -500.078566 23.924481 -499.989024 13.989632 -503.195299 12.052233 -500.928547 9.962574 -502.986357 7.979219 -500.146835 13.981614 -598.070855 2.073737 13.209191 4.550553 9.813732 43.235220 5.687063 9.980404 5.282514 70.279619 2.209593 10.487013 1.159805 17.483979

Общая характеристика набора данных¶

Размер набора данных:

In [6]:
data_name = []
data_size = []

for name in data_dict:
    data_name.append(name)
    data_size.append(data_dict[name].shape)

pd.DataFrame(data_size,
             columns=['Количество строк', 'Количество столбцов'],
             index=data_name)
Out[6]:
Количество строк Количество столбцов
train 14579 87
test 4860 53
full 19439 87

Убедимся, что сумма количества строк в наборах данных train и test равна количеству строк в наборе данных full.

In [7]:
train.shape[0] + test.shape[0]
Out[7]:
19439

Количество дубликатов в наименованиях признаков:

In [8]:
data_name = []
columns_duplicated = []

for name in data_dict:
    data_name.append(name)
    columns_duplicated.append(data_dict[name].columns.duplicated().sum())

pd.DataFrame(columns_duplicated,
             columns=['Количество дубликатов столбцов'],
             index=data_name)
Out[8]:
Количество дубликатов столбцов
train 0
test 0
full 0

Уникальные наименования признаков:

In [9]:
train_columns = []
test_columns = []
full_columns = []
count_train_columns = 0
count_test_columns = 0
count_full_columns = 0

for column_name in full.columns.sort_values():
    if column_name in train.columns:
        train_columns.append('+')
        count_train_columns +=1
    else:
        train_columns.append('')
    if column_name in test.columns:
        test_columns.append('+')
        count_test_columns +=1
    else:
        test_columns.append('')
    if column_name in full.columns:
        full_columns.append('+')
        count_full_columns +=1
    else:
        full_columns.append('')

pd.concat([
    pd.DataFrame({'train_columns': train_columns,
                  'test_columns': test_columns,
                  'full_columns': full_columns},
                 index = full.columns.sort_values().tolist()),
    pd.DataFrame({'Всего признаков': [count_train_columns,
                                      count_test_columns,
                                      count_full_columns]},
                 index = ['train_columns', 'test_columns', 'full_columns']).T
])
Out[9]:
train_columns test_columns full_columns
date + + +
final.output.concentrate_ag + +
final.output.concentrate_au + +
final.output.concentrate_pb + +
final.output.concentrate_sol + +
final.output.recovery + +
final.output.tail_ag + +
final.output.tail_au + +
final.output.tail_pb + +
final.output.tail_sol + +
primary_cleaner.input.depressant + + +
primary_cleaner.input.feed_size + + +
primary_cleaner.input.sulfate + + +
primary_cleaner.input.xanthate + + +
primary_cleaner.output.concentrate_ag + +
primary_cleaner.output.concentrate_au + +
primary_cleaner.output.concentrate_pb + +
primary_cleaner.output.concentrate_sol + +
primary_cleaner.output.tail_ag + +
primary_cleaner.output.tail_au + +
primary_cleaner.output.tail_pb + +
primary_cleaner.output.tail_sol + +
primary_cleaner.state.floatbank8_a_air + + +
primary_cleaner.state.floatbank8_a_level + + +
primary_cleaner.state.floatbank8_b_air + + +
primary_cleaner.state.floatbank8_b_level + + +
primary_cleaner.state.floatbank8_c_air + + +
primary_cleaner.state.floatbank8_c_level + + +
primary_cleaner.state.floatbank8_d_air + + +
primary_cleaner.state.floatbank8_d_level + + +
rougher.calculation.au_pb_ratio + +
rougher.calculation.floatbank10_sulfate_to_au_feed + +
rougher.calculation.floatbank11_sulfate_to_au_feed + +
rougher.calculation.sulfate_to_au_concentrate + +
rougher.input.feed_ag + + +
rougher.input.feed_au + + +
rougher.input.feed_pb + + +
rougher.input.feed_rate + + +
rougher.input.feed_size + + +
rougher.input.feed_sol + + +
rougher.input.floatbank10_sulfate + + +
rougher.input.floatbank10_xanthate + + +
rougher.input.floatbank11_sulfate + + +
rougher.input.floatbank11_xanthate + + +
rougher.output.concentrate_ag + +
rougher.output.concentrate_au + +
rougher.output.concentrate_pb + +
rougher.output.concentrate_sol + +
rougher.output.recovery + +
rougher.output.tail_ag + +
rougher.output.tail_au + +
rougher.output.tail_pb + +
rougher.output.tail_sol + +
rougher.state.floatbank10_a_air + + +
rougher.state.floatbank10_a_level + + +
rougher.state.floatbank10_b_air + + +
rougher.state.floatbank10_b_level + + +
rougher.state.floatbank10_c_air + + +
rougher.state.floatbank10_c_level + + +
rougher.state.floatbank10_d_air + + +
rougher.state.floatbank10_d_level + + +
rougher.state.floatbank10_e_air + + +
rougher.state.floatbank10_e_level + + +
rougher.state.floatbank10_f_air + + +
rougher.state.floatbank10_f_level + + +
secondary_cleaner.output.tail_ag + +
secondary_cleaner.output.tail_au + +
secondary_cleaner.output.tail_pb + +
secondary_cleaner.output.tail_sol + +
secondary_cleaner.state.floatbank2_a_air + + +
secondary_cleaner.state.floatbank2_a_level + + +
secondary_cleaner.state.floatbank2_b_air + + +
secondary_cleaner.state.floatbank2_b_level + + +
secondary_cleaner.state.floatbank3_a_air + + +
secondary_cleaner.state.floatbank3_a_level + + +
secondary_cleaner.state.floatbank3_b_air + + +
secondary_cleaner.state.floatbank3_b_level + + +
secondary_cleaner.state.floatbank4_a_air + + +
secondary_cleaner.state.floatbank4_a_level + + +
secondary_cleaner.state.floatbank4_b_air + + +
secondary_cleaner.state.floatbank4_b_level + + +
secondary_cleaner.state.floatbank5_a_air + + +
secondary_cleaner.state.floatbank5_a_level + + +
secondary_cleaner.state.floatbank5_b_air + + +
secondary_cleaner.state.floatbank5_b_level + + +
secondary_cleaner.state.floatbank6_a_air + + +
secondary_cleaner.state.floatbank6_a_level + + +
Всего признаков 87 53 87

Количество элементов данных:

In [10]:
data_name = []
data_size = []

for name in data_dict:
    data_name.append(name)
    data_size.append(data_dict[name].size)

pd.DataFrame(data_size,
             columns=['Количество элементов данных'],
             index=data_name)
Out[10]:
Количество элементов данных
train 1268373
test 257580
full 1691193

Типы данных набора данных:

In [11]:
data_name = []
data_types = pd.DataFrame()

for name in data_dict:
    data_name.append(name)
    data_types = pd.concat([
        data_types,
        pd.DataFrame(data_dict[name].dtypes.value_counts(), columns=[name]).T
    ])

data_types
Out[11]:
float64 object
train 86 1
test 52 1
full 86 1

Пропущенные значения в данных:

In [12]:
total = full.isna().sum().sort_values(ascending=False)
percent = (full.isna().mean() * 100).round(1).sort_values(ascending=False)
pd.concat([total, percent], axis=1, keys=['Всего пропусков', '%'])
Out[12]:
Всего пропусков %
secondary_cleaner.output.tail_sol 1748 9.0
rougher.input.floatbank11_xanthate 453 2.3
rougher.state.floatbank10_e_air 436 2.2
primary_cleaner.output.concentrate_sol 370 1.9
secondary_cleaner.state.floatbank2_a_air 220 1.1
final.output.concentrate_sol 211 1.1
rougher.input.feed_size 145 0.7
primary_cleaner.output.concentrate_pb 116 0.6
primary_cleaner.input.xanthate 104 0.5
final.output.tail_pb 101 0.5
rougher.input.feed_pb 100 0.5
rougher.input.feed_sol 99 0.5
primary_cleaner.output.tail_sol 62 0.3
rougher.input.floatbank11_sulfate 44 0.2
primary_cleaner.input.depressant 37 0.2
rougher.input.floatbank10_sulfate 34 0.2
primary_cleaner.input.sulfate 24 0.1
rougher.output.concentrate_sol 23 0.1
secondary_cleaner.state.floatbank2_b_air 23 0.1
primary_cleaner.output.tail_pb 21 0.1
secondary_cleaner.state.floatbank3_a_air 13 0.1
secondary_cleaner.output.tail_pb 12 0.1
rougher.input.feed_rate 11 0.1
rougher.input.floatbank10_xanthate 8 0.0
secondary_cleaner.state.floatbank4_a_air 6 0.0
final.output.tail_sol 6 0.0
primary_cleaner.output.tail_ag 4 0.0
primary_cleaner.state.floatbank8_b_air 4 0.0
primary_cleaner.state.floatbank8_a_air 4 0.0
primary_cleaner.state.floatbank8_d_air 3 0.0
rougher.calculation.sulfate_to_au_concentrate 2 0.0
secondary_cleaner.output.tail_ag 2 0.0
primary_cleaner.state.floatbank8_c_air 2 0.0
secondary_cleaner.state.floatbank6_a_air 2 0.0
rougher.calculation.floatbank11_sulfate_to_au_feed 2 0.0
rougher.calculation.floatbank10_sulfate_to_au_feed 2 0.0
secondary_cleaner.state.floatbank3_b_air 1 0.0
final.output.tail_ag 1 0.0
final.output.concentrate_pb 1 0.0
final.output.concentrate_ag 1 0.0
secondary_cleaner.state.floatbank4_b_level 1 0.0
secondary_cleaner.state.floatbank4_b_air 1 0.0
secondary_cleaner.state.floatbank2_a_level 1 0.0
secondary_cleaner.state.floatbank6_a_level 1 0.0
secondary_cleaner.state.floatbank3_a_level 1 0.0
secondary_cleaner.state.floatbank4_a_level 1 0.0
secondary_cleaner.state.floatbank2_b_level 1 0.0
secondary_cleaner.state.floatbank5_a_air 1 0.0
secondary_cleaner.state.floatbank5_b_level 1 0.0
secondary_cleaner.state.floatbank5_b_air 1 0.0
secondary_cleaner.state.floatbank3_b_level 1 0.0
secondary_cleaner.state.floatbank5_a_level 1 0.0
primary_cleaner.state.floatbank8_b_level 1 0.0
rougher.state.floatbank10_a_level 1 0.0
primary_cleaner.state.floatbank8_d_level 1 0.0
primary_cleaner.state.floatbank8_c_level 1 0.0
rougher.state.floatbank10_a_air 1 0.0
primary_cleaner.state.floatbank8_a_level 1 0.0
rougher.state.floatbank10_c_level 1 0.0
rougher.state.floatbank10_c_air 1 0.0
rougher.output.tail_ag 1 0.0
rougher.state.floatbank10_b_air 1 0.0
rougher.state.floatbank10_b_level 1 0.0
final.output.concentrate_au 0 0.0
secondary_cleaner.output.tail_au 0 0.0
rougher.state.floatbank10_d_air 0 0.0
primary_cleaner.output.tail_au 0 0.0
rougher.state.floatbank10_e_level 0 0.0
final.output.recovery 0 0.0
final.output.tail_au 0 0.0
rougher.input.feed_ag 0 0.0
rougher.state.floatbank10_d_level 0 0.0
rougher.state.floatbank10_f_level 0 0.0
rougher.state.floatbank10_f_air 0 0.0
primary_cleaner.output.concentrate_ag 0 0.0
rougher.calculation.au_pb_ratio 0 0.0
rougher.output.concentrate_au 0 0.0
rougher.output.concentrate_ag 0 0.0
rougher.output.concentrate_pb 0 0.0
rougher.output.recovery 0 0.0
rougher.output.tail_au 0 0.0
rougher.output.tail_pb 0 0.0
rougher.output.tail_sol 0 0.0
primary_cleaner.input.feed_size 0 0.0
rougher.input.feed_au 0 0.0
primary_cleaner.output.concentrate_au 0 0.0
date 0 0.0

Промежуточный вывод

  • Набор данных full содержит 87 уникальных признаков и 19 439 записей,
    набор данных train — 87 уникальных признаков и 14 579 записей,
    набор данных test — 53 уникальных признака и 4860 записей.
  • Всего элементов данных в наборе данных full — 1 691 193,
    в наборе данных train — 1 268 373,
    в наборе данных test — 257 580.
  • Набор данных full содержит данные следующего типа:
    • вещественный — 86 признаков,
    • смешанного типа — 1 признак,
  • набор данных train содержит данные следующего типа:
    • вещественный — 86 признаков,
    • смешанного типа — 1 признак,
  • набор данных test содержит данные следующего типа:
    • вещественный — 52 признака,
    • смешанного типа — 1 признак.
  • Все признаки содержат значения (не являются пустыми).
  • В наборе данных full 24 признака не содержат пропущенные значения.
  • 63 признака в наборе данных full содержат пропущенные значения:
    • распределение пропусков в данных не носит регулярный характер,
    • всего в данных 4481 пропущенное значение — около 23 % от всех элементов данных.
  • В тренировочном наборе данных присутствуют все признаки, а в тестовом наборе данных отсутствуют признаки, характеризующие содержание компонентов (металлов и солей) в концентратах на всех стадиях рассматриваемого технологического процесса, а также все признаки, получаемые расчётным способом, в том числе, коэффициенты извлечения золота из руды. Такая ситуация возникла потому, что в наборе данных train содержатся исторические сведения о ведении технологического процесса: параметры, получаемые на технологической линии, и данные, получаемые после аналитического контроля из заводской лаборатории, которые характеризуют химический состав концентратов и конечного продукта. В наборе данных test содержатся данные текущего технологического процесса: технологические операции на линиях непрерывно выполняются, а результатов аналитического контроля ещё нет (заводская лаборатория ещё не провела испытания), в том числе остаётся неизвестным коэффициент извлечения золота. Таким образом, прогностическая модель, обученная на параметрах работы технологического оборудования, позволит предсказывать значение величины, получаемое в результате аналитического контроля.
  • Необходимо вновь провести разделение всех доступных данных на тестовую и обучающую выборки.

Понимание данных¶

Добытая и измельчённая руда поступает на флотационное обогащение. Процесс обогащения золота включает в себя стадию флотации и две стадии очистки (первую и вторую).

Контроль параметров процесса выполняется через определённый временной период. Поэтому каждый набор параметров производства сопровождается указанием даты и времени их регистрации.

date — дата и время регистрации показателей
Признак является количественным, дискретным.
Шкала измерения признака: интервальная шкала.

Принципиальная технологическая схема стадии флотации и стадий очистки 1 и 2 приведена на рис. 1.


%D0%A1%D1%85%D0%B5%D0%BC%D0%B0.png

Рис. 1. Принципиальная технологическая схема стадии флотации и стадий очистки 1 и 2.


Наименование каждой стадии указывается в начале названия каждого признака.

rougher.<контролируемый параметр> — стадия флотации.

primary_cleaner.<контролируемый параметр> — стадия очистки 1.

secondary_cleaner.<контролируемый параметр> — стадия очистки 2.

Признаки, содержащие значения параметров продукта (готового флотоконцентрата) и отходов производства ("хвостов") на выходе с флотационного обогащения, обозначаются как final.<контролируемый параметр>.

Точки отбора сырья, полупродуктов и продукта, а также вспомогательных веществ на аналитический контроль обозначаются после наименования стадии и отделяются от него точкой.

<стадия>.input.<компонент> — точки отбора расположены во входящем на стадию потоке.

<стадия>.output.<компонент> — точки отбора расположены в выходящем со стадии потоке.

Кроме того, таким способом обозначаются физико-химические показатели, относящиеся к основному потоку в зависимости от того, где они были измерены: при входе на стадию или при выходе со стадии.

Точки контроля параметров работы технологического оборудования обозначаются как <стадия>.state.<аппарат>.

Расчётные величины обозначаются как <стадия>.calculation.<величина>.

Все непосредственно измеряемые параметры указываются в наименованиях признаков в конце их наименований.
Признаки являются количественными, непрерывными.
Шкала измерения признаков: шкала отношений.

  • Содержание металлов (золота, серебра, свинца) и солей других металлов в исходном сырье, полупродуктах, продукте и в отходах производства обозначают после указания точки отбора, отделяя от неё точкой.

<стадия>.<точка отбора>.feed_au — содержание золота в исходной сырье.

<стадия>.<точка отбора>.feed_ag — содержание серебра в исходном сырье.

<стадия>.<точка отбора>.feed_pb — содержание свинца в исходном сырье.

<стадия>.<точка отбора>.feed_sol — содержание солей остальных металлов в исходном сырье.

<стадия>.<точка отбора>.concentrate_au — содержание золота в концентратах.

<стадия>.<точка отбора>.concentrate_ag — содержание серебра в концентратах.

<стадия>.<точка отбора>.concentrate_pb — содержание свинца в концентратах.

<стадия>.<точка отбора>.concentrate_sol — содержание солей остальных металлов в концентратах.

<стадия>.<точка отбора>.tail_au — содержание золота в отходах.

<стадия>.<точка отбора>.tail_ag — содержание серебра в отходах.

<стадия>.<точка отбора>.tail_pb — содержание свинца в отходах.

<стадия>.<точка отбора>.tail_sol — содержание солей остальных металлов в отходах.

  • Физико-химические показатели, относящиеся к основному потоку.

<стадия>.<точка контроля>.feed_size — размер гранул сырья или полупродукта.

<стадия>.<точка контроля>.feed_rate — скорость подачи сырья.

  • Вспомогательные вещества подаются либо на стадию, либо непосредственно в аппарат. Поэтому каждый компонент указывается после наименования точки отбора, либо после дополнительно указанного наименования аппарата.

<стадия>.<точка отбора>.depressant — количество вносимого депрессанта (силиката натрия).

<стадия>.<точка отбора>.sulfate — количество вносимого сульфата (на данном производстве, сульфида натрия).

<стадия>.<точка отбора>.<аппарат>_sulfate — количество вносимого в аппарат сульфата (на данном производстве, сульфида натрия).

<стадия>.<точка отбора>.xanthate — количество вносимого ксантогената.

<стадия>.<точка отбора>.<аппарат>_xanthate — количество вносимого в аппарат ксантогената.

  • У флотационных установок контролируются два параметра:

<стадия>.<параметр контроля>.<аппарат>_air — объём пропускаемого через установку воздуха.

<стадия>.<параметр контроля>.<аппарат>_level — уровень жидкости в установке.

  • Рассчитываемые величины, которые сопровождают технологический процесс:

<стадия>.<расчётное значение>.<аппарат>_sulfate_to_au_feed — отношение количества добавляемого в аппарат сульфата к содержанию золота в сырье.

<стадия>.<расчётное значение>.sulfate_to_au_concentrate — отношение количества добавляемого сульфата к содержанию золота в концентрате.

<стадия>.<расчётное значение>.au_pb_ratio — соотношение золота и свинца в сырье.

<стадия>.<расчётное значение>.recovery — коэффициент извлечения золота (%) — целевая переменная.

Описание данных¶

Предварительно зададим функции, позволяющие выводить статистику в техническом виде.

In [13]:
def describe_data(columns):
    '''
    Функция рассчитывает краткие описательные статистики
    и строит графики распределений.

    Принимает список с названиями признаков (именами колонок)
    набора данных 'full'.
    Возвращает DataFrame с описательными статистиками,
    диаграмму распределения значений и диаграмму размаха.
    '''

    display(full[columns].describe().round(2).T)

    for column in columns:
        plt.figure(figsize=(5, 3))
        plt.title(label=f'Диаграмма распределения\nзначений признака\n{column}')
        plt.hist(full[column], bins=100)
        plt.xlabel('Значение признака')
        plt.ylabel('Частота')
        plt.show()

    full[columns].plot(kind='box', vert=False, figsize=(10, 5))
    plt.title('Диаграммы размаха значений признаков')
    plt.xlabel('Значение признака')
    plt.ylabel('Признак')
    plt.show()
In [14]:
def freq_table_min(columns):
    '''
    Функция выводит 5 уникальных значений из левого "хвоста" распределения.

    Принимает список с названиями признаков (именами колонок)
    набора данных 'full'.
    Возвращает DataFrame с 5 уникальными минимальными значениями
    в распределении для каждого признака.
    '''

    result = pd.DataFrame()

    for column in columns:
        result = result.join(
            pd.DataFrame(full[column].value_counts().sort_index().head().index,
                         columns=[column]), how='outer')

    return result
In [15]:
def freq_table_max(columns):
    '''
    Функция выводит 5 уникальных значений из правого "хвоста" распределения.

    Принимает список с названиями признаков (именами колонок)
    набора данных 'full'.
    Возвращает DataFrame с 5 уникальными максимальными значениями
    в распределении для каждого признака.
    '''

    result = pd.DataFrame()

    for column in columns:
        result = result.join(
            pd.DataFrame(full[column].value_counts()\
                         .sort_index(ascending=False).head().index,
                         columns=[column]), how='outer')

    return result

Дата и время¶

In [16]:
len(full['date'].unique())
Out[16]:
19439

date — дата и время регистрации показателей
Значения определены для всех записей.
Все значения признака являются уникальными.

Содержание металлов и солей в потоках¶

Содержание серебра в потоках¶

In [17]:
columns = ['rougher.input.feed_ag',
           'rougher.output.concentrate_ag',
           'primary_cleaner.output.concentrate_ag',
           'final.output.concentrate_ag',
           'rougher.output.tail_ag',
           'primary_cleaner.output.tail_ag',
           'secondary_cleaner.output.tail_ag',
           'final.output.tail_ag']
In [18]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.feed_ag 19439.0 8.79 1.94 0.01 7.24 8.59 10.21 14.60
rougher.output.concentrate_ag 19439.0 11.99 2.73 0.00 10.63 12.10 13.74 24.48
primary_cleaner.output.concentrate_ag 19439.0 8.44 2.05 0.00 7.26 8.51 9.81 16.08
final.output.concentrate_ag 19438.0 5.17 1.37 0.00 4.25 5.07 5.90 16.00
rougher.output.tail_ag 19438.0 5.59 1.11 0.59 4.89 5.77 6.39 12.72
primary_cleaner.output.tail_ag 19435.0 16.15 3.55 0.00 14.02 15.84 18.01 29.46
secondary_cleaner.output.tail_ag 19437.0 14.59 4.27 0.00 12.64 15.64 17.36 23.26
final.output.tail_ag 19438.0 9.69 2.33 0.00 8.06 9.74 11.13 19.55

Таблица минимальных значений признаков.

In [19]:
freq_table_min(columns).T
Out[19]:
0 1 2 3 4
rougher.input.feed_ag 0.010000 0.568441 1.015676 1.106758 1.116930
rougher.output.concentrate_ag 0.000000 0.010000 0.351874 0.905993 1.180162
primary_cleaner.output.concentrate_ag 0.000000 0.010000 0.018661 0.038086 0.116097
final.output.concentrate_ag 0.000000 0.010000 0.193950 0.289059 0.371783
rougher.output.tail_ag 0.594562 2.158369 2.170361 2.278989 2.316530
primary_cleaner.output.tail_ag 0.000000 0.235819 0.368401 0.437259 0.475679
secondary_cleaner.output.tail_ag 0.000000 0.017409 0.167573 0.248164 0.295360
final.output.tail_ag 0.000000 0.016790 0.078405 0.080674 0.101624

rougher.input.feed_ag — содержание серебра во входящем на стадию флотации потоке
Значения определены для всех записей.
Минимальное значение — 0,01, максимальное — 14,6.
Среднее арифметическое — 8,8, медиана — 8,6.

rougher.output.concentrate_ag — содержание серебра в выходящем со стадии флотации потоке
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 24,5.
Среднее арифметическое — 12, медиана — 12,1.

primary_cleaner.output.concentrate_ag — содержание серебра в выходящем со стадии очистки 1 потоке
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 16,1.
Среднее арифметическое — 8,4, медиана — 8,5.

final.output.concentrate_ag — содержание серебра во флотоконцентрате
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0, максимальное — 16.
Среднее арифметическое — 5,2, медиана — 5,1.

rougher.output.tail_ag — содержание серебра в отходах со стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0,6, максимальное — 12,7.
Среднее арифметическое — 5,6, медиана — 5,8.

primary_cleaner.output.tail_ag — содержание серебра в отходах со стадии очистки 1
Значения определены для 19 435 записей из 19 439.
Минимальное значение — 0, максимальное — 29,5.
Среднее арифметическое — 16,1, медиана — 15,8.

secondary_cleaner.output.tail_ag — содержание серебра в отходах со стадии очистки 2
Значения определены для 19 437 записей из 19 439.
Минимальное значение — 0, максимальное — 23,3.
Среднее арифметическое — 14,6, медиана — 15,6.

final.output.tail_ag — содержание серебра в отходах флотационного обогащения
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0, максимальное — 19,6.
Среднее арифметическое — 9,7, медиана — 9,7.

Содержание золота в потоках¶

In [20]:
columns = ['rougher.input.feed_au',
           'rougher.output.concentrate_au',
           'primary_cleaner.output.concentrate_au',
           'final.output.concentrate_au',
           'rougher.output.tail_au',
           'primary_cleaner.output.tail_au',
           'secondary_cleaner.output.tail_au',
           'final.output.tail_au']
In [21]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.feed_au 19439.0 8.27 1.96 0.01 6.85 8.13 9.77 13.73
rougher.output.concentrate_au 19439.0 19.77 3.75 0.00 18.80 20.28 21.72 28.82
primary_cleaner.output.concentrate_au 19439.0 32.12 5.63 0.00 30.46 32.84 35.05 45.93
final.output.concentrate_au 19439.0 44.08 5.13 0.00 43.40 45.01 46.28 52.76
rougher.output.tail_au 19439.0 1.82 0.68 0.02 1.40 1.81 2.21 9.69
primary_cleaner.output.tail_au 19439.0 3.91 1.59 0.00 2.92 3.62 4.59 17.79
secondary_cleaner.output.tail_au 19439.0 4.34 2.33 0.00 3.18 4.07 5.06 26.81
final.output.tail_au 19439.0 3.04 0.92 0.00 2.46 2.98 3.57 8.25

Таблица минимальных значений признаков.

In [22]:
freq_table_min(columns).T
Out[22]:
0 1 2 3 4
rougher.input.feed_au 0.010000 0.568632 0.588152 0.625968 0.714036
rougher.output.concentrate_au 0.000000 0.010000 0.570819 1.889855 1.912582
primary_cleaner.output.concentrate_au 0.000000 0.010000 0.056590 0.135919 0.439876
final.output.concentrate_au 0.000000 0.010000 0.904254 1.063992 1.195223
rougher.output.tail_au 0.020676 0.024545 0.031234 0.031642 0.049731
primary_cleaner.output.tail_au 0.000000 0.045269 0.052055 0.056646 0.125645
secondary_cleaner.output.tail_au 0.000000 0.005877 0.033529 0.040478 0.042254
final.output.tail_au 0.000000 0.000777 0.005462 0.016073 0.020922

rougher.input.feed_au — содержание золота во входящем на стадию флотации потоке
Значения определены для всех записей.
Минимальное значение — 0,01, максимальное — 13,7.
Среднее арифметическое — 8,3, медиана — 8,1.

rougher.output.concentrate_au — содержание золота в выходящем со стадии флотации потоке
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 28,8.
Среднее арифметическое — 19,8, медиана — 20,3.

primary_cleaner.output.concentrate_au — содержание золота в выходящем со стадии очистки 1 потоке
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 45,9.
Среднее арифметическое — 32,1, медиана — 32,8.

final.output.concentrate_au — содержание золота во флотоконцентрате
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 52,8.
Среднее арифметическое — 44,1, медиана — 45.

rougher.output.tail_au — содержание золота в отходах со стадии флотации
Значения определены для всех записей.
Минимальное значение — 0,02, максимальное — 9,7.
Среднее арифметическое — 1,8, медиана — 1,8.

primary_cleaner.output.tail_au — содержание золота в отходах со стадии очистки 1
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 17,8.
Среднее арифметическое — 3,9, медиана — 3,6.

secondary_cleaner.output.tail_au — содержание золота в отходах со стадии очистки 2
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 26,8.
Среднее арифметическое — 4,3, медиана — 4,1.

final.output.tail_au — содержание золота в отходах флотационного обогащения
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 8,2.
Среднее арифметическое — 3, медиана — 3.

Содержание свинца в потоках¶

In [23]:
columns = ['rougher.input.feed_pb',
           'rougher.output.concentrate_pb',
           'primary_cleaner.output.concentrate_pb',
           'final.output.concentrate_pb',
           'rougher.output.tail_pb',
           'primary_cleaner.output.tail_pb',
           'secondary_cleaner.output.tail_pb',
           'final.output.tail_pb']
In [24]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.feed_pb 19339.0 3.60 1.05 0.01 2.89 3.53 4.24 7.14
rougher.output.concentrate_pb 19439.0 7.61 1.80 0.00 6.73 7.74 8.57 13.62
primary_cleaner.output.concentrate_pb 19323.0 9.83 2.56 0.00 8.70 10.15 11.42 17.08
final.output.concentrate_pb 19438.0 9.98 1.67 0.00 9.14 10.10 11.04 17.03
rougher.output.tail_pb 19439.0 0.65 0.25 0.01 0.48 0.62 0.78 3.78
primary_cleaner.output.tail_pb 19418.0 3.44 1.39 0.00 2.50 3.27 4.18 9.63
secondary_cleaner.output.tail_pb 19427.0 5.78 2.77 0.00 3.86 5.34 7.79 17.04
final.output.tail_pb 19338.0 2.71 0.95 0.00 2.04 2.75 3.33 5.80

Таблица минимальных значений признаков.

In [25]:
freq_table_min(columns).T
Out[25]:
0 1 2 3 4
rougher.input.feed_pb 0.010000 0.088552 0.125889 0.128727 0.157686
rougher.output.concentrate_pb 0.000000 0.010000 0.214360 0.629964 0.772184
primary_cleaner.output.concentrate_pb 0.000000 0.010000 0.021357 0.045857 0.090132
final.output.concentrate_pb 0.000000 0.010000 0.332391 0.571758 0.629302
rougher.output.tail_pb 0.007566 0.009014 0.010670 0.011073 0.013077
primary_cleaner.output.tail_pb 0.000000 0.049552 0.084681 0.089703 0.090518
secondary_cleaner.output.tail_pb 0.000000 0.007514 0.065370 0.073368 0.100373
final.output.tail_pb 0.000000 0.004508 0.018764 0.020475 0.030546

rougher.input.feed_pb — содержание свинца во входящем на стадию флотации потоке
Значения определены для 19 339 записей из 19 439.
Минимальное значение — 0,01, максимальное — 7,1.
Среднее арифметическое — 3,6, медиана — 3,5.

rougher.output.concentrate_pb — содержание свинца в выходящем со стадии флотации потоке
Значения определены для всех записей.
Минимальное значение — 0, максимальное — 13,6.
Среднее арифметическое — 7,6, медиана — 7,7.

primary_cleaner.output.concentrate_pb — содержание свинца в выходящем со стадии очистки 1 потоке
Значения определены для 19 323 записей из 19 439.
Минимальное значение — 0, максимальное — 17,1.
Среднее арифметическое — 9,8, медиана — 10,2.

final.output.concentrate_pb — содержание свинца во флотоконцентрате
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0, максимальное — 17.
Среднее арифметическое — 10, медиана — 10,1.

rougher.output.tail_pb — содержание свинца в отходах со стадии флотации
Значения определены для всех записей.
Минимальное значение — 0,01, максимальное — 3,8.
Среднее арифметическое — 0,6, медиана — 0,6.

primary_cleaner.output.tail_pb — содержание свинца в отходах со стадии очистки 1
Значения определены для 19 418 записей из 19 439.
Минимальное значение — 0, максимальное — 9,6.
Среднее арифметическое — 3,4, медиана — 3,3.

secondary_cleaner.output.tail_pb — содержание свинца в отходах со стадии очистки 2
Значения определены для 19 427 записей из 19 439.
Минимальное значение — 0, максимальное — 17.
Среднее арифметическое — 5,8, медиана — 5,3.

final.output.tail_pb — содержание свинца в отходах флотационного обогащения
Значения определены для 19 338 записей из 19 439.
Минимальное значение — 0, максимальное — 5,8.
Среднее арифметическое — 2,7, медиана — 2,7.

Содержание солей других металлов в потоках¶

In [26]:
columns = ['rougher.input.feed_sol',
           'rougher.output.concentrate_sol',
           'primary_cleaner.output.concentrate_sol',
           'final.output.concentrate_sol',
           'rougher.output.tail_sol',
           'primary_cleaner.output.tail_sol',
           'secondary_cleaner.output.tail_sol',
           'final.output.tail_sol']
In [27]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.feed_sol 19340.0 36.70 5.15 0.01 34.21 37.20 40.04 53.48
rougher.output.concentrate_sol 19416.0 28.81 5.94 0.00 27.22 29.84 32.19 38.35
primary_cleaner.output.concentrate_sol 19069.0 10.49 3.91 0.00 7.89 10.31 13.45 22.46
final.output.concentrate_sol 19228.0 9.50 2.79 0.00 7.72 9.22 10.95 19.62
rougher.output.tail_sol 19439.0 18.06 3.45 10.01 15.82 18.11 20.09 66.12
primary_cleaner.output.tail_sol 19377.0 7.97 2.21 0.00 6.75 8.18 9.55 22.28
secondary_cleaner.output.tail_sol 17691.0 7.17 3.92 0.00 3.85 7.69 10.41 26.00
final.output.tail_sol 19433.0 10.58 2.87 0.00 8.94 10.62 12.10 22.32

Таблица минимальных значений признаков.

In [28]:
freq_table_min(columns).T
Out[28]:
0 1 2 3 4
rougher.input.feed_sol 0.010000 0.463867 1.393488 1.716285 3.091118
rougher.output.concentrate_sol 0.000000 0.010000 0.879593 1.715906 2.152051
primary_cleaner.output.concentrate_sol 0.000000 0.010000 0.016416 0.062800 0.067671
final.output.concentrate_sol 0.000000 0.010000 0.253231 0.268995 0.291099
rougher.output.tail_sol 10.014648 10.024005 10.035363 10.058485 10.059291
primary_cleaner.output.tail_sol 0.000000 0.033303 0.074203 0.126310 0.179470
secondary_cleaner.output.tail_sol 0.000000 0.014898 0.021719 0.024451 0.036183
final.output.tail_sol 0.000000 0.077731 0.104827 0.131452 0.160814

rougher.input.feed_sol — содержание других солей во входящем на стадию флотации потоке
Значения определены для 19 340 записей из 19 439.
Минимальное значение — 0,01, максимальное — 53,5.
Среднее арифметическое — 36,7, медиана — 37,2.

rougher.output.concentrate_sol — содержание других солей в выходящем со стадии флотации потоке
Значения определены для 19 416 записей из 19 439.
Минимальное значение — 0, максимальное — 38,4.
Среднее арифметическое — 28,8, медиана — 29,8.

primary_cleaner.output.concentrate_sol — содержание других солей в выходящем со стадии очистки 1 потоке
Значения определены для 19 069 записей из 19 439.
Минимальное значение — 0, максимальное — 22,5.
Среднее арифметическое — 10,5, медиана — 10,3.

final.output.concentrate_sol — содержание других солей во флотоконцентрате
Значения определены для 19 228 записей из 19 439.
Минимальное значение — 0, максимальное — 19,6.
Среднее арифметическое — 9,5, медиана — 9,2.

rougher.output.tail_sol — содержание других солей в отходах со стадии флотации
Значения определены для всех записей.
Минимальное значение — 10, максимальное — 66,1.
Среднее арифметическое — 18,1, медиана — 18,1.

primary_cleaner.output.tail_sol — содержание других солей в отходах со стадии очистки 1
Значения определены для 19 377 записей из 19 439.
Минимальное значение — 0, максимальное — 22,3.
Среднее арифметическое — 8, медиана — 8,2.

secondary_cleaner.output.tail_sol — содержание других солей в отходах со стадии очистки 2
Значения определены для 17 691 записи из 19 439.
Минимальное значение — 0, максимальное — 26.
Среднее арифметическое — 7,2, медиана — 7,7.

final.output.tail_sol — содержание других солей в отходах флотационного обогащения
Значения определены для 19 433 записей из 19 439.
Минимальное значение — 0, максимальное — 22,3.
Среднее арифметическое — 10,6, медиана — 10,6.

Промежуточный вывод подраздела

  • Значения определяются автоматическими измерителями, поэтому значения зарегистрированы до 16 знака после запятой. Однако точность определения значений, очевидно, гораздо ниже.
  • Распределения значений большинства признаков унимодальные, некоторых — бимодальные, реже встречаются мультимодальные.
  • Несмотря на это, значения среднего арифметического и медианы у каждого признака расположены близко.
  • Минимальные и максимальные значения содержания различных металлов и солей имеют одинаковый порядок величины, что согласуется с единой природой измеряемых величин.
  • Среди признаков есть такие, которые содержат небольшое число пропусков. Такие пропуски могли возникнуть при сохранении измеренных данных, загрузке их в хранилище, извлечении из него. Среди признаков, характеризующих содержание золота в потоках, пропуски отсутствуют.
  • Также есть признаки, содержащие большое количество пропущенных значений (например, в признаке secondary_cleaner.output.tail_sol их почти 10 %). Это может быть связано как с нестабильной работой измерительного оборудования, так и с тем, что измерение могло не проводиться в принципе для этих показателей.
  • Среди значений признаков, характеризующих содержание металлов и солей в потоках, выделяются аномально низкие значения: нулевые значения и значения, близкие к нулю, которые часто встречаются в наборах данных, но при этом расположены в "хвостах" распределений слева. Кроме того, для подобных значений наблюдается подозрительная точность измерения: например, 0,01.
  • Поскольку для каждого измерительного прибора, регистрирующего содержание вещества в смеси, существует предел обнаружения, который больше нуля (по определению), значение 0 не может быть достигнуто в принципе. Такая ситуация может возникнуть из-за скачка напряжения или других чрезвычайных и краткосрочных ситуаций, приводящих к потере измерительным прибором своих функций.
  • Следовательно, значения 0,01 и 0 среди значений содержания металлов и солей в потоках можно считать аномальными, а записи с такими значениями требующими предварительной обработки.
  • Необходимо также обработать пропущенные значения.

Вспомогательные вещества¶

In [29]:
columns = ['rougher.input.floatbank10_sulfate',
           'rougher.input.floatbank10_xanthate',
           'rougher.input.floatbank11_sulfate',
           'rougher.input.floatbank11_xanthate',
           'primary_cleaner.input.depressant',
           'primary_cleaner.input.sulfate',
           'primary_cleaner.input.xanthate']
In [30]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.floatbank10_sulfate 19405.0 12.33 3.43 0.0 10.00 12.00 14.72 36.12
rougher.input.floatbank10_xanthate 19431.0 6.02 1.13 0.0 5.40 6.01 6.80 9.70
rougher.input.floatbank11_sulfate 19395.0 12.06 3.78 0.0 10.00 12.00 14.64 37.98
rougher.input.floatbank11_xanthate 18986.0 6.07 1.10 0.0 5.40 6.10 6.80 9.70
primary_cleaner.input.depressant 19402.0 8.82 3.29 0.0 6.08 8.04 11.01 40.00
primary_cleaner.input.sulfate 19415.0 144.62 44.46 0.0 114.11 143.23 175.08 265.98
primary_cleaner.input.xanthate 19335.0 1.02 0.51 0.0 0.70 0.94 1.21 4.10

Таблица минимальных значений признаков.

In [31]:
freq_table_min(columns).T
Out[31]:
0 1 2 3 4
rougher.input.floatbank10_sulfate 0.001083 0.001147 0.001164 0.001613 0.002683
rougher.input.floatbank10_xanthate 0.000568 0.001428 0.001822 0.001963 0.002150
rougher.input.floatbank11_sulfate 0.000077 0.000098 0.000163 0.000529 0.000726
rougher.input.floatbank11_xanthate 0.000290 0.000406 0.000578 0.000818 0.000953
primary_cleaner.input.depressant 0.000000 0.003839 0.007721 0.012244 0.012373
primary_cleaner.input.sulfate 0.003112 0.051279 0.067424 0.129139 0.396662
primary_cleaner.input.xanthate 0.000005 0.000154 0.000214 0.000291 0.000346

Таблицы частот с максимальными значениями признаков.

In [32]:
freq_table_max(columns).T
Out[32]:
0 1 2 3 4
rougher.input.floatbank10_sulfate 36.118275 31.393045 30.830567 30.631803 30.272362
rougher.input.floatbank10_xanthate 9.703448 9.674621 9.655247 9.517497 9.491715
rougher.input.floatbank11_sulfate 37.980648 32.780762 31.849375 30.011666 30.007997
rougher.input.floatbank11_xanthate 9.698407 9.668678 9.667279 9.514789 9.496275
primary_cleaner.input.depressant 40.000000 20.052255 20.046764 20.045827 20.038590
primary_cleaner.input.sulfate 265.983123 262.531502 262.293482 262.061026 262.003703
primary_cleaner.input.xanthate 4.102454 4.068384 4.027341 4.014188 4.012052

rougher.input.floatbank10_sulfate — содержание сульфата во входящем на стадию флотации потоке (аппарат поз. 10)
Значения определены для 19 405 записей из 19 439.
Минимальное значение — 0,001, максимальное — 36,1.
Среднее арифметическое — 12,3, медиана — 12.

rougher.input.floatbank10_xanthate — содержание ксантата во входящем на стадию флотации потоке (аппарат поз. 10)
Значения определены для 19 431 записи из 19 439.
Минимальное значение — 0,001, максимальное — 9,7.
Среднее арифметическое — 6, медиана — 6.

rougher.input.floatbank11_sulfate — содержание сульфата во входящем на стадию флотации потоке (аппарат поз. 11)
Значения определены для 19 395 записей из 19 439.
Минимальное значение — 0,0001, максимальное — 38.
Среднее арифметическое — 12,1, медиана — 12.

rougher.input.floatbank11_xanthate — содержание ксантата во входящем на стадию флотации потоке (аппарат поз. 11)
Значения определены для 18 986 записей из 19 439.
Минимальное значение — 0,0003, максимальное — 9,7.
Среднее арифметическое — 6,1, медиана — 6,1.

primary_cleaner.input.depressant — содержание депрессанта во входящем потоке на стадию очистки 1
Значения определены для 19 402 записей из 19 439.
Минимальное значение — 0, максимальное — 40.
Среднее арифметическое — 8,8, медиана — 8.

primary_cleaner.input.sulfate — содержание сульфата во входящем потоке на стадию очистки 1
Значения определены для 19 415 записей из 19 439.
Минимальное значение — 0,003, максимальное — 266.
Среднее арифметическое — 144,6, медиана — 143,2.

primary_cleaner.input.xanthate — содержание ксантата во входящем потоке на стадию очистки 1
Значения определены для 19 335 записей из 19 439.
Минимальное значение — 0,00001, максимальное — 4,1.
Среднее арифметическое — 1, медиана — 0,9.

Промежуточный вывод подраздела

  • Значения определяются автоматическими измерителями, поэтому значения зарегистрированы до 16 знака после запятой. Однако точность определения значений, очевидно, гораздо ниже.
  • Распределения значений большинства признаков унимодальные. И хотя по своей природе величина является непрерывной, на диаграммах распределений наблюдается дискретный характер распределения величины.
  • Значения среднего арифметического и медианы у каждого признака расположены близко.
  • Среди признаков есть такие, которые содержат небольшое число пропусков. Такие пропуски могли возникнуть при сохранении измеренных данных, загрузке их в хранилище, извлечении из него.
  • Также есть признак, содержащий большое количество пропущенных значений (почти 10 % пропусков в признаке rougher.input.floatbank11_xanthate). Это может быть связано как с нестабильной работой измерительного оборудования, так и с тем, что измерение могло не проводиться в принципе для этого показателя.
  • Среди значений признаков, характеризующих содержание вспомогательных веществ в потоках, выделяются аномально низкие значения: нулевые значения и значения, близкие к нулю, которые часто встречаются в наборе данных, но при этом расположены в "хвостах" распределений слева; аномально высокие значения, которые расположены в "хвостах" распределений справа на значительном удалении от большинства остальных значений. Кроме того, для подобных значений наблюдается подозрительная точность измерения: 0, 40.
  • Поскольку для каждого измерительного прибора, регистрирующего содержание вещества в смеси, существует предел обнаружения, который больше нуля (по определению), значение 0 не может быть достигнуто в принципе. Такая ситуация может возникнуть из-за скачка напряжения или других чрезвычайных и краткосрочных ситуаций, приводящих к потере измерительным прибором функций. Это же может привести к тому, что прибор будет регистрировать аномально низкие значения, которые находятся значительно ниже предела обнаружения и могут быть значительно меньше предела погрешности средства измерения.
  • Следовательно, значения 0, 40, а также значения близкие к нулю (< 0,001) среди значений содержания вспомогательных веществ в потоках можно считать аномальными и требующими предварительной обработки.
  • Необходимо также обработать пропущенные значения.

Скорость потока и размер частиц¶

In [33]:
columns = ['rougher.input.feed_rate',
           'rougher.input.feed_size',
           'primary_cleaner.input.feed_size']
In [34]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.input.feed_rate 19428.0 478.32 105.37 0.00 416.53 499.42 550.17 717.51
rougher.input.feed_size 19294.0 58.97 21.63 0.05 47.44 54.61 65.02 484.97
primary_cleaner.input.feed_size 19439.0 7.31 0.61 1.08 6.94 7.28 7.67 15.50

Таблица минимальных значений признаков.

In [35]:
freq_table_min(columns).T
Out[35]:
0 1 2 3 4
rougher.input.feed_rate 0.002986 0.012786 0.022802 0.023393 0.023788
rougher.input.feed_size 0.046369 0.049194 0.052019 0.054843 9.659576
primary_cleaner.input.feed_size 1.080000 1.080007 4.970000 5.310000 5.410000

rougher.input.feed_rate — скорость подачи руды в линию
Значения определены для 19 428 записей из 19 439.
Минимальное значение — 0,003, максимальное — 717,5.
Среднее арифметическое — 478,3, медиана — 499,4.

rougher.input.feed_size — размер частиц руды, подаваемой на стадию флотации
Значения определены для 19 294 записей из 19 439.
Минимальное значение — 0,05, максимальное — 485.
Среднее арифметическое — 59, медиана — 54,6.

primary_cleaner.input.feed_size — размер частиц концентрата, выходящего со стадии флотации и подаваемого на стадию очистки 1
Значения определены для всех записей.
Минимальное значение — 1,1, максимальное — 15,5.
Среднее арифметическое — 7,3, медиана — 7,3.

Промежуточный вывод подраздела

  • Значения определяются автоматическими измерителями, поэтому значения зарегистрированы до 16 знака после запятой. Однако точность определения значений, очевидно, гораздо ниже.
  • Распределения значений признаков унимодальные. Однако на диаграмме распределения скоростей потока наблюдается дискретный характер распределения величины несмотря на то, что по своей природе она является непрерывной.
  • Значения среднего арифметического и медианы у каждого признака расположены близко.
  • Признаки содержат небольшое число пропусков. Такие пропуски могли возникнуть при сохранении измеренных данных, загрузке их в хранилище, извлечении из него. Возможно также, что ошибка возникла у измерительного прибора во время регистрации и записи измеренного значения.
  • Слева в "хвосте" распределения значений признака rougher.input.feed_rate находятся аномально низкие значения скорости потока (< 5).
  • Слева в "хвосте" распределения признака rougher.input.feed_size находятся аномально низкие значения (< 1). Частиц с таким размером даже нет после стадии флотации, на которой происходит отделение мелкодисперсной фракции руды.
  • Таким образом, необходимо провести предварительную обработку пропущенных значений и аномальных значений признаков rougher.input.feed_rate и rougher.input.feed_size.

Объём воздуха¶

In [36]:
columns = ['rougher.state.floatbank10_a_air',
           'rougher.state.floatbank10_b_air',
           'rougher.state.floatbank10_c_air',
           'rougher.state.floatbank10_d_air',
           'rougher.state.floatbank10_e_air',
           'rougher.state.floatbank10_f_air',
           'primary_cleaner.state.floatbank8_a_air',
           'primary_cleaner.state.floatbank8_b_air',
           'primary_cleaner.state.floatbank8_c_air',
           'primary_cleaner.state.floatbank8_d_air']
In [37]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.state.floatbank10_a_air 19438.0 1105.32 160.83 -0.04 999.66 1001.07 1205.62 1521.98
rougher.state.floatbank10_b_air 19438.0 1320.22 176.29 -0.72 1199.63 1301.58 1448.63 1809.19
rougher.state.floatbank10_c_air 19438.0 1299.97 202.80 -0.06 1151.08 1300.21 1449.46 2499.13
rougher.state.floatbank10_d_air 19439.0 1211.56 204.02 -0.99 1061.05 1201.57 1352.88 1817.20
rougher.state.floatbank10_e_air 19003.0 1080.87 172.15 -1.98 998.68 1050.03 1199.43 1922.64
rougher.state.floatbank10_f_air 19439.0 1025.27 164.49 -2.59 901.00 999.92 1099.72 1706.31
primary_cleaner.state.floatbank8_a_air 19435.0 1589.35 129.00 0.00 1505.06 1600.60 1697.66 2103.10
primary_cleaner.state.floatbank8_b_air 19435.0 1591.34 131.81 0.00 1503.63 1600.52 1699.22 2114.91
primary_cleaner.state.floatbank8_c_air 19437.0 1586.67 136.11 0.00 1500.93 1600.25 1699.48 2013.16
primary_cleaner.state.floatbank8_d_air 19436.0 1542.91 246.20 0.00 1494.22 1599.45 1698.52 2398.90

Таблица минимальных значений признаков.

In [38]:
freq_table_min(columns).T
Out[38]:
0 1 2 3 4
rougher.state.floatbank10_a_air -4.206929e-02 -4.107792e-02 -0.020163 -0.020059 155.593194
rougher.state.floatbank10_b_air -7.218064e-01 -6.619201e-01 -0.653384 -0.408072 270.696463
rougher.state.floatbank10_c_air -5.663551e-02 -3.511233e-02 -0.026301 2.426204 265.315357
rougher.state.floatbank10_d_air -9.922190e-01 -9.274013e-01 -0.554299 -0.124766 304.093664
rougher.state.floatbank10_e_air -1.982295e+00 -1.970275e+00 -1.936877 -1.915434 94.372023
rougher.state.floatbank10_f_air -2.593390e+00 -2.520792e+00 -2.430587 -2.328641 28.332355
primary_cleaner.state.floatbank8_a_air 5.445860e-32 7.805874e-32 0.006352 0.016993 304.788187
primary_cleaner.state.floatbank8_b_air 6.647490e-32 9.528241e-32 0.008700 0.023275 306.005110
primary_cleaner.state.floatbank8_c_air 4.033736e-32 5.781792e-32 0.015159 0.040552 1.421099
primary_cleaner.state.floatbank8_d_air 4.039220e-32 5.789652e-32 0.008655 0.023153 131.321672

rougher.state.floatbank10_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_a) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−0,04), максимальное — 1522.
Среднее арифметическое — 1105, медиана — 1001.

rougher.state.floatbank10_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_b) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−0,7), максимальное — 1809.
Среднее арифметическое — 1320, медиана — 1302.

rougher.state.floatbank10_c_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_c) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−0,06), максимальное — 2499.
Среднее арифметическое — 1300, медиана — 1300.

rougher.state.floatbank10_d_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_d) на стадии флотации
Значения определены для всех записей.
Минимальное значение — (−1), максимальное — 1817.
Среднее арифметическое — 1212, медиана — 1202.

rougher.state.floatbank10_e_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_e) на стадии флотации
Значения определены для 19 003 записей из 19 439.
Минимальное значение — (−2), максимальное — 1923.
Среднее арифметическое — 1081, медиана — 1050.

rougher.state.floatbank10_f_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 10_f) на стадии флотации
Значения определены для всех записей.
Минимальное значение — (−3), максимальное — 1706.
Среднее арифметическое — 1025, медиана — 1000.

primary_cleaner.state.floatbank8_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 8_a) на стадии очистки 1
Значения определены для 19 435 записей из 19 439.
Минимальное значение — $5\cdot10^{-32}$, максимальное — 2103.
Среднее арифметическое — 1589, медиана — 1601.

primary_cleaner.state.floatbank8_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 8_b) на стадии очистки 1
Значения определены для 19 435 записей из 19 439.
Минимальное значение — $7\cdot10^{-32}$, максимальное — 2115.
Среднее арифметическое — 1591, медиана — 1601.

primary_cleaner.state.floatbank8_c_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 8_c) на стадии очистки 1
Значения определены для 19 437 записей из 19 439.
Минимальное значение — $4\cdot10^{-32}$, максимальное — 2013.
Среднее арифметическое — 1587, медиана — 1600.

primary_cleaner.state.floatbank8_d_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 8_d) на стадии очистки 1
Значения определены для 19 436 записей из 19 439.
Минимальное значение — $4\cdot10^{-32}$, максимальное — 2399.
Среднее арифметическое — 1543, медиана — 1599.

In [39]:
columns = ['secondary_cleaner.state.floatbank2_a_air',
           'secondary_cleaner.state.floatbank2_b_air',
           'secondary_cleaner.state.floatbank3_a_air',
           'secondary_cleaner.state.floatbank3_b_air',
           'secondary_cleaner.state.floatbank4_a_air',
           'secondary_cleaner.state.floatbank4_b_air',
           'secondary_cleaner.state.floatbank5_a_air',
           'secondary_cleaner.state.floatbank5_b_air',
           'secondary_cleaner.state.floatbank6_a_air']
In [40]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
secondary_cleaner.state.floatbank2_a_air 19219.0 28.71 5.46 0.08 25.05 29.10 33.01 52.65
secondary_cleaner.state.floatbank2_b_air 19416.0 24.11 5.75 0.00 20.92 25.04 28.01 35.15
secondary_cleaner.state.floatbank3_a_air 19426.0 28.20 6.13 0.00 24.95 27.98 33.00 44.26
secondary_cleaner.state.floatbank3_b_air 19438.0 22.20 5.57 0.00 19.00 22.01 26.00 35.07
secondary_cleaner.state.floatbank4_a_air 19433.0 18.99 5.41 0.00 14.98 18.02 23.01 30.12
secondary_cleaner.state.floatbank4_b_air 19438.0 15.01 4.89 0.00 11.94 14.97 19.03 31.27
secondary_cleaner.state.floatbank5_a_air 19438.0 15.69 5.51 -0.37 10.99 15.00 18.03 43.71
secondary_cleaner.state.floatbank5_b_air 19438.0 12.20 5.33 0.53 8.97 11.02 14.02 27.93
secondary_cleaner.state.floatbank6_a_air 19437.0 18.96 5.55 -0.08 14.98 19.96 24.00 32.19

Таблица минимальных значений признаков.

In [41]:
freq_table_min(columns).T
Out[41]:
0 1 2 3 4
secondary_cleaner.state.floatbank2_a_air 0.077503 1.220129e-01 1.425403e-01 1.440420e-01 1.627969e-01
secondary_cleaner.state.floatbank2_b_air 0.000000 6.778101e-18 8.210020e-18 9.309321e-18 1.276527e-17
secondary_cleaner.state.floatbank3_a_air 0.000000 1.833598e-21 1.957942e-17 2.495226e-17 3.309031e-17
secondary_cleaner.state.floatbank3_b_air 0.000000 6.137256e-22 1.521587e-17 1.158437e-16 3.130303e-10
secondary_cleaner.state.floatbank4_a_air 0.000000 1.079872e-16 2.706261e-10 7.271605e-05 7.949184e-04
secondary_cleaner.state.floatbank4_b_air 0.000000 2.489718e-17 8.306354e-17 2.030172e-10 6.802814e-05
secondary_cleaner.state.floatbank5_a_air -0.372054 -3.719793e-01 -3.717388e-01 -3.714983e-01 -3.714907e-01
secondary_cleaner.state.floatbank5_b_air 0.528083 6.462077e-01 6.680429e-01 6.794086e-01 6.922236e-01
secondary_cleaner.state.floatbank6_a_air -0.079426 1.681479e-02 1.273038e-01 1.507513e-01 1.603862e-01

secondary_cleaner.state.floatbank2_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 2_a) на стадии очистки 2
Значения определены для 19 219 записей из 19 439.
Минимальное значение — 0,1, максимальное — 52,7.
Среднее арифметическое — 28,7, медиана — 29,1.

secondary_cleaner.state.floatbank2_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 2_b) на стадии очистки 2
Значения определены для 19 416 записей из 19 439.
Минимальное значение — 0, максимальное — 35,2.
Среднее арифметическое — 24,1, медиана — 25.

secondary_cleaner.state.floatbank3_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 3_a) на стадии очистки 2
Значения определены для 19 426 записей из 19 439.
Минимальное значение — 0, максимальное — 44,3.
Среднее арифметическое — 28,2, медиана — 28.

secondary_cleaner.state.floatbank3_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 3_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0, максимальное — 35,1.
Среднее арифметическое — 22,2, медиана — 22.

secondary_cleaner.state.floatbank4_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 4_a) на стадии очистки 2
Значения определены для 19 433 записей из 19 439.
Минимальное значение — 0, максимальное — 30,1.
Среднее арифметическое — 19, медиана — 18.

secondary_cleaner.state.floatbank4_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 4_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0, максимальное — 31,3.
Среднее арифметическое — 15, медиана — 15.

secondary_cleaner.state.floatbank5_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 5_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−0,4), максимальное — 43,7.
Среднее арифметическое — 15,7, медиана — 15.

secondary_cleaner.state.floatbank5_b_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 5_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — 0,5, максимальное — 27,9.
Среднее арифметическое — 12,2, медиана — 11.

secondary_cleaner.state.floatbank6_a_air — объём воздуха, пропускаемого через флотационный аппарат (поз. 6_a) на стадии очистки 2
Значения определены для 19 437 записей из 19 439.
Минимальное значение — (−0,1), максимальное — 32,2.
Среднее арифметическое — 19, медиана — 20.

Промежуточный вывод подраздела

  • Значения определяются автоматическими измерителями, поэтому значения зарегистрированы до 16 знака после запятой. Однако точность определения значений, очевидно, гораздо ниже.
  • Распределения значений признаков носят дискретный характер.
  • Значения среднего арифметического и медианы у каждого признака расположены близко.
  • Среди признаков есть такие, которые содержат небольшое число пропусков. Такие пропуски могли возникнуть при сохранении измеренных данных, загрузке их в хранилище, извлечении из него.
  • Также есть признаки, содержащие значительное количество пропущенных значений (почти 10 % пропусков, например, в признаке rougher.state.floatbank10_e_air). Это может быть связано как с нестабильной работой измерительного оборудования, так и с тем, что измерение могло не проводиться в принципе для этих показателей.
  • Среди значений признаков, характеризующих объём подаваемого во флотаторы воздуха, выделяются аномально низкие значения: нулевые и близкие к нулю значения, а также отрицательные значения (также близкие к нулю).
  • Очевидно, поскольку значение подаваемого в аппарат воздуха должно быть больше нуля (процесс флотационого обогащения непрерывный), значение 0 и близко расположенные к нулю значения (< 0,1 для признаков secondary_cleaner.state.floatbank(n)_(a,b)_air и < 100 для признаков rougher.state.floatbank10_(a,b,c,d,e,f)_air и primary_cleaner.state.floatbank8_(a,b,c,d)_air) не могут быть достигнуты. Такая ситуация может возникнуть из-за скачка напряжения или других чрезвычайных и краткосрочных ситуаций, приводящих к потере измерительным прибором своих функций. Это же может привести к тому, что прибор будет регистрировать околонулевые значения.
  • Поэтому значения, близкие к нулю, среди значений признаков, характеризующих объём пропускаемого воздуха через флотатор, можно считать аномальными и требующими предварительной обработки.
  • Необходимо также обработать пропущенные значения.

Уровень жидкости¶

In [42]:
columns = ['rougher.state.floatbank10_a_level',
           'rougher.state.floatbank10_b_level',
           'rougher.state.floatbank10_c_level',
           'rougher.state.floatbank10_d_level',
           'rougher.state.floatbank10_e_level',
           'rougher.state.floatbank10_f_level',
           'primary_cleaner.state.floatbank8_a_level',
           'primary_cleaner.state.floatbank8_b_level',
           'primary_cleaner.state.floatbank8_c_level',
           'primary_cleaner.state.floatbank8_d_level']
In [43]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
rougher.state.floatbank10_a_level 19438.0 -376.61 93.91 -657.95 -499.84 -300.26 -299.98 -273.78
rougher.state.floatbank10_b_level 19438.0 -467.25 54.67 -650.26 -500.20 -499.78 -400.62 -296.38
rougher.state.floatbank10_c_level 19438.0 -467.72 53.53 -647.54 -500.22 -499.71 -400.99 -292.16
rougher.state.floatbank10_d_level 19439.0 -468.24 53.92 -648.39 -500.39 -499.53 -401.64 -76.40
rougher.state.floatbank10_e_level 19439.0 -466.04 57.38 -649.44 -500.23 -499.66 -401.16 -139.75
rougher.state.floatbank10_f_level 19439.0 -466.27 57.85 -649.95 -500.52 -499.47 -401.51 -191.72
primary_cleaner.state.floatbank8_a_level 19438.0 -491.20 32.43 -798.64 -500.31 -499.93 -499.43 -57.20
primary_cleaner.state.floatbank8_b_level 19438.0 -492.19 33.79 -800.00 -500.44 -499.96 -499.37 -142.53
primary_cleaner.state.floatbank8_c_level 19438.0 -491.98 32.71 -799.96 -500.70 -499.91 -498.86 -150.94
primary_cleaner.state.floatbank8_d_level 19438.0 -488.02 43.96 -799.79 -500.46 -499.91 -499.06 -30.60

Таблица максимальных значений признаков.

In [44]:
freq_table_max(columns).T
Out[44]:
0 1 2 3 4
rougher.state.floatbank10_a_level -273.776101 -278.320576 -281.039299 -281.041967 -281.044634
rougher.state.floatbank10_b_level -296.383080 -298.036622 -298.078576 -298.200051 -298.227537
rougher.state.floatbank10_c_level -292.155509 -293.273988 -295.103390 -296.383919 -296.813767
rougher.state.floatbank10_d_level -76.397327 -208.330673 -282.986203 -290.190398 -292.463560
rougher.state.floatbank10_e_level -139.753025 -272.199598 -294.832453 -295.323395 -296.011250
rougher.state.floatbank10_f_level -191.718480 -243.846376 -249.801043 -254.174195 -258.300939
primary_cleaner.state.floatbank8_a_level -57.195404 -189.696878 -282.988443 -330.134203 -347.040563
primary_cleaner.state.floatbank8_b_level -142.527229 -238.807102 -246.047833 -339.751525 -341.660086
primary_cleaner.state.floatbank8_c_level -150.937035 -229.338520 -290.845404 -346.653450 -346.792216
primary_cleaner.state.floatbank8_d_level -30.601828 -40.027176 -66.377169 -107.595099 -114.780485

rougher.state.floatbank10_a_level — уровень жидкости во флотационном аппарате (поз. 10_a) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−658), максимальное — (−274).
Среднее арифметическое — (−377), медиана — (−300).

rougher.state.floatbank10_b_level — уровень жидкости во флотационном аппарате (поз. 10_b) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−650), максимальное — (−296).
Среднее арифметическое — (−467), медиана — (−500).

rougher.state.floatbank10_c_level — уровень жидкости во флотационном аппарате (поз. 10_c) на стадии флотации
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−648), максимальное — (−292).
Среднее арифметическое — (−468), медиана — (−500).

rougher.state.floatbank10_d_level — уровень жидкости во флотационном аппарате (поз. 10_d) на стадии флотации
Значения определены для всех записей.
Минимальное значение — (−648), максимальное — (−76).
Среднее арифметическое — (−468), медиана — (−500).

rougher.state.floatbank10_e_level — уровень жидкости во флотационном аппарате (поз. 10_e) на стадии флотации
Значения определены для всех записей.
Минимальное значение — (−649), максимальное — (−140).
Среднее арифметическое — (−466), медиана — (−500).

rougher.state.floatbank10_f_level — уровень жидкости во флотационном аппарате (поз. 10_f) на стадии флотации
Значения определены для всех записей.
Минимальное значение — (−650), максимальное — (−192).
Среднее арифметическое — (−466), медиана — (−499).

primary_cleaner.state.floatbank8_a_level — уровень жидкости во флотационном аппарате (поз. 8_a) на стадии очистки 1
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−799), максимальное — (−57).
Среднее арифметическое — (−491), медиана — (−500).

primary_cleaner.state.floatbank8_b_level — уровень жидкости во флотационном аппарате (поз. 8_b) на стадии очистки 1
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−143).
Среднее арифметическое — (−492), медиана — (−500).

primary_cleaner.state.floatbank8_c_level — уровень жидкости во флотационном аппарате (поз. 8_c) на стадии очистки 1
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−151).
Среднее арифметическое — (−492), медиана — (−500).

primary_cleaner.state.floatbank8_d_level — уровень жидкости во флотационном аппарате (поз. 8_d) на стадии очистки 1
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−31).
Среднее арифметическое — (−488), медиана — (−500).

In [45]:
columns = ['secondary_cleaner.state.floatbank2_a_level',
           'secondary_cleaner.state.floatbank2_b_level',
           'secondary_cleaner.state.floatbank3_a_level',
           'secondary_cleaner.state.floatbank3_b_level',
           'secondary_cleaner.state.floatbank4_a_level',
           'secondary_cleaner.state.floatbank4_b_level',
           'secondary_cleaner.state.floatbank5_a_level',
           'secondary_cleaner.state.floatbank5_b_level',
           'secondary_cleaner.state.floatbank6_a_level']
In [46]:
describe_data(columns)
plt.show()
count mean std min 25% 50% 75% max
secondary_cleaner.state.floatbank2_a_level 19438.0 -502.37 53.57 -799.61 -500.23 -499.97 -499.67 -127.88
secondary_cleaner.state.floatbank2_b_level 19438.0 -503.23 56.57 -799.87 -500.25 -500.02 -499.79 -212.00
secondary_cleaner.state.floatbank3_a_level 19438.0 -486.20 54.41 -799.76 -500.21 -499.93 -499.33 -191.68
secondary_cleaner.state.floatbank3_b_level 19438.0 -493.74 43.37 -809.33 -500.12 -499.98 -499.81 -159.74
secondary_cleaner.state.floatbank4_a_level 19438.0 -485.89 47.76 -799.80 -500.70 -499.84 -498.25 -245.24
secondary_cleaner.state.floatbank4_b_level 19438.0 -461.08 67.41 -800.84 -500.19 -499.46 -400.12 -6.51
secondary_cleaner.state.floatbank5_a_level 19438.0 -488.68 34.53 -797.32 -500.46 -499.80 -498.38 -244.48
secondary_cleaner.state.floatbank5_b_level 19438.0 -487.15 38.35 -800.22 -500.13 -499.94 -499.44 -137.74
secondary_cleaner.state.floatbank6_a_level 19438.0 -505.44 37.69 -809.74 -500.73 -500.05 -499.50 -104.43

Таблица максимальных значений признаков.

In [47]:
freq_table_max(columns).T
Out[47]:
0 1 2 3 4
secondary_cleaner.state.floatbank2_a_level -127.875565 -166.933103 -172.639078 -179.583857 -194.455620
secondary_cleaner.state.floatbank2_b_level -211.999273 -212.064665 -216.660814 -221.684802 -223.045323
secondary_cleaner.state.floatbank3_a_level -191.678810 -246.396324 -246.479860 -252.878296 -262.843412
secondary_cleaner.state.floatbank3_b_level -159.742331 -159.797516 -163.888539 -179.157914 -186.530007
secondary_cleaner.state.floatbank4_a_level -245.239184 -326.000930 -334.928409 -351.922004 -366.990021
secondary_cleaner.state.floatbank4_b_level -6.506986 -7.834746 -12.498243 -13.175555 -15.646201
secondary_cleaner.state.floatbank5_a_level -244.483566 -275.073125 -282.534868 -287.910009 -288.963521
secondary_cleaner.state.floatbank5_b_level -137.740004 -141.934397 -144.171219 -148.080088 -149.705075
secondary_cleaner.state.floatbank6_a_level -104.427459 -123.307487 -136.679155 -183.202019 -194.978411

secondary_cleaner.state.floatbank2_a_level — уровень жидкости во флотационном аппарате (поз. 2_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−128).
Среднее арифметическое — (−502), медиана — (−500).

secondary_cleaner.state.floatbank2_b_level — уровень жидкости во флотационном аппарате (поз. 2_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−212).
Среднее арифметическое — (−503), медиана — (−500).

secondary_cleaner.state.floatbank3_a_level — уровень жидкости во флотационном аппарате (поз. 3_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−192).
Среднее арифметическое — (−486), медиана — (−500).

secondary_cleaner.state.floatbank3_b_level — уровень жидкости во флотационном аппарате (поз. 3_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−809), максимальное — (−160).
Среднее арифметическое — (−494), медиана — (−500).

secondary_cleaner.state.floatbank4_a_level — уровень жидкости во флотационном аппарате (поз. 4_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−245).
Среднее арифметическое — (−486), медиана — (−500).

secondary_cleaner.state.floatbank4_b_level — уровень жидкости во флотационном аппарате (поз. 4_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−801), максимальное — (−7).
Среднее арифметическое — (−461), медиана — (−500).

secondary_cleaner.state.floatbank5_a_level — уровень жидкости во флотационном аппарате (поз. 5_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−797), максимальное — (−244).
Среднее арифметическое — (−489), медиана — (−500).

secondary_cleaner.state.floatbank5_b_level — уровень жидкости во флотационном аппарате (поз. 5_b) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−800), максимальное — (−138).
Среднее арифметическое — (−487), медиана — (−500).

secondary_cleaner.state.floatbank6_a_level — уровень жидкости во флотационном аппарате (поз. 6_a) на стадии очистки 2
Значения определены для 19 438 записей из 19 439.
Минимальное значение — (−810), максимальное — (−104).
Среднее арифметическое — (−505), медиана — (−500).

Промежуточный вывод подраздела

  • Значения определяются автоматическими измерителями, поэтому значения зарегистрированы до 16 знака после запятой. Однако точность определения значений, очевидно, гораздо ниже.
  • Распределения значений признаков носят дискретный характер. Большинство значений имеют узкие распределения вокруг двух или трёх значений.
  • Значения среднего арифметического и медианы у каждого признака расположены близко.
  • Признаки почти не содержат пропуски (максимум два пропущенных значения).
  • Среди значений признаков, характеризующих уровни жидкости во флотаторах, выделяются сильные выбросы (> −100). Такие значения являются редкостью и наблюдаются лишь у некоторых признаков.
  • Скорее всего, уровень жидкости в сосуде отмеряется от верха, поэтому имеет отрицательные значения. Значения, большие чем −100, могут свидетельствовать об предаварийной ситуации, поскольку уровень жидкости в таких случаях находится близко к краю сосуда, что не характерно для обычного протекания технологического процесса.
  • Поэтому значения, большие (−100), среди значений признаков, характеризующих уровень жидкости во флотаторе, требуют предварительной обработки.
  • Необходимо также обработать пропущенные значения.

Расчётные величины¶

In [48]:
full[['rougher.calculation.au_pb_ratio']].describe().T
Out[48]:
count mean std min 25% 50% 75% max
rougher.calculation.au_pb_ratio 19439.0 2.420119 0.814935 -0.010548 2.035434 2.309665 2.731794 39.379272
In [49]:
plt.figure(figsize=(10, 3))
plt.title('Диаграмма распределения значений признака' +
          '\nrougher.calculation.au_pb_ratio')
plt.hist(full['rougher.calculation.au_pb_ratio'], bins=100)
plt.ylabel('Частота')
plt.xlabel('Значение признака')
plt.show()

rougher.calculation.au_pb_ratio — соотношение золота и свинца в сырье
Значения определены для всех записей.
Минимальное значение — (−0,01), максимальное — 39,4.
Среднее арифметическое — 2,4, медиана — 2,3.

In [50]:
full[['rougher.calculation.floatbank10_sulfate_to_au_feed',
      'rougher.calculation.floatbank11_sulfate_to_au_feed']].describe().T
Out[50]:
count mean std min 25% 50% 75% max
rougher.calculation.floatbank10_sulfate_to_au_feed 19437.0 3393.052498 4943.845943 -486.598675 2611.425833 3018.353876 3676.769750 629638.977914
rougher.calculation.floatbank11_sulfate_to_au_feed 19437.0 3256.854171 5781.423659 -264.982785 2551.437587 2997.218088 3601.998911 718684.955855
In [51]:
plt.figure(figsize=(10, 3))
plt.title('Диаграмма распределения значений признака' +
          '\nrougher.calculation.floatbank10_sulfate_to_au_feed')
plt.hist(full['rougher.calculation.floatbank10_sulfate_to_au_feed'], bins=100)
plt.ylabel('Частота')
plt.xlabel('Значение признака')
plt.show()
In [52]:
plt.figure(figsize=(10, 3))
plt.title('Диаграмма распределения значений признака' +
          '\nrougher.calculation.floatbank11_sulfate_to_au_feed')
plt.hist(full['rougher.calculation.floatbank11_sulfate_to_au_feed'], bins=100)
plt.ylabel('Частота')
plt.xlabel('Значение признака')
plt.show()

rougher.calculation.floatbank10_sulfate_to_au_feed — отношение количества сульфата, добавляемого во флотационный аппарат (поз. 10) на стадии флотации, к содержанию золота во входящем потоке
Значения определены для 19 437 записей из 19 439.
Минимальное значение — (−486), максимальное — 629 639.
Среднее арифметическое — 3393, медиана — 3018.

rougher.calculation.floatbank11_sulfate_to_au_feed — отношение количества сульфата, добавляемого во флотационный аппарат (поз. 11) на стадии флотации, к содержанию золота во входящем потоке
Значения определены для 19 437 записей из 19 439.
Минимальное значение — (−265), максимальное — 718 685.
Среднее арифметическое — 3257, медиана — 2997.

In [53]:
full[['rougher.calculation.sulfate_to_au_concentrate']].describe().T
Out[53]:
count mean std min 25% 50% 75% max
rougher.calculation.sulfate_to_au_concentrate 19437.0 42171.189025 324362.111569 -4.223520e+07 40700.94604 44696.480712 48168.210371 3428098.939
In [54]:
plt.figure(figsize=(10, 3))
plt.title('Диаграмма распределения значений признака' +
          '\nrougher.calculation.sulfate_to_au_concentrate')
plt.hist(full['rougher.calculation.sulfate_to_au_concentrate'], bins=100)
plt.ylabel('Частота')
plt.xlabel('Значение признака')
plt.show()

rougher.calculation.sulfate_to_au_concentrate — отношение количества добавляемого сульфата к содержанию золота в концентрате на стадии флотации
Значения определены для 19 437 записей из 19 439.
Минимальное значение — (−42 000 000), максимальное — 3 400 000.
Среднее арифметическое — 42 71, медиана — 44 696.

In [55]:
full[['rougher.output.recovery',
      'final.output.recovery']].describe().T
Out[55]:
count mean std min 25% 50% 75% max
rougher.output.recovery 19439.0 83.328587 14.148086 0.0 81.037957 86.188892 90.010670 100.0
final.output.recovery 19439.0 67.050208 10.125840 0.0 63.299712 68.172738 72.686642 100.0
In [56]:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 5))
ax1.set_title('Диаграмма распределения и диаграмма размаха' +
              '\nзначений признака rougher.output.recovery')
ax1.hist(full['rougher.output.recovery'], bins=100)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax2.boxplot(full['rougher.output.recovery'], vert=False)
ax2.tick_params(left=False, labelleft=False)
ax2.set_xlabel('Значение признака')
plt.show()
In [57]:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 5))
ax1.set_title('Диаграмма распределения и диаграмма размаха' +
              '\nзначений признака final.output.recovery')
ax1.hist(full['final.output.recovery'], bins=100)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax2.boxplot(full['final.output.recovery'], vert=False)
ax2.tick_params(left=False, labelleft=False)
ax2.set_xlabel('Значение признака')
plt.show()

rougher.output.recovery — коэффициент извлечения золота на стадии флотации
Значения определены для всех записей.
Минимальное значение — 0 %, максимальное — 100 %.
Среднее арифметическое — 83,3 %, медиана — 86,2 %.

final.output.recovery — коэффициент извлечения золота в результате флотационного обогащения
Значения определены для всех записей.
Минимальное значение — 0 %, максимальное — 100 %.
Среднее арифметическое — 67,1 %, медиана — 68,2 %.

Промежуточный вывод подраздела

  • Значения рассчитаны автоматически на предприятии, исходя из значений показателей технологического режима.
  • Распределения значений признаков носят унимодальный характер.
  • Значения среднего арифметического и медианы у каждого признака различаются не сильно.
  • Признаки почти не содержат пропуски (максимум два пропущенных значения).
  • Среди значений признаков присутствуют аномально большие и аномально низкие значения. Эти значения являются следствием ошибок в значениях признаков, из которых значения текущих признаков были рассчитаны.
  • Значения признаков rougher.calculation.au_pb_ratio, rougher.calculation.floatbank10_sulfate_to_au_feed, rougher.calculation.floatbank11_sulfate_to_au_feed, rougher.calculation.sulfate_to_au_concentrate не повлияют на модель, поскольку данные признаки не будут использованы при её построении. Предварительная обработка этих признаков не требуется.
  • Среди значений признаков rougher.output.recovery и final.output.recovery есть аномальные значения: 0 % и 100 %. Однако после выполнения обработки значений признаков, характеризующих содержание золота в потоках, проблема аномальных значений коэффициента извлечения перестанет существовать.

Проверка правильности автоматического расчёта коэффициента извлечения¶

Для того чтобы использовать автоматически рассчитанные на производственной линии значения коэффициентов извлечения, необходимо им доверять. Для этого нужно рассчитать значения коэффициентов извлечения по данным о содержании золота в потоках на стадии флотации и для всего процесса флотационного обогащения в целом.

Рассчитаем для каждого наблюдения коэффициент извлечения золота по формуле:

$k = \frac{c_{выход} \times (c_{вход} - c_{отход})}{c_{вход} \times (c_{выход} - c_{отход})}$,

где $c_{вход}$ — содержание золота во входящем потоке на стадию,
$c_{выход}$ — содержание золота в выходящем со стадии потоке,
$c_{отход}$ — содержание золота в отвальных «хвостах» со стадии.

Расчёт коэффициента извлечения произведём по значениям признаков в обучающей выборке для стадии флотации.

In [58]:
data = pd.DataFrame({
    'auto_estimated_recovery': train['rougher.output.recovery'].tolist(),
    'recalculated_recovery':
    (train['rougher.output.concentrate_au'] *
     (train['rougher.input.feed_au'] - train['rougher.output.tail_au']) /
     (train['rougher.input.feed_au'] *
      (train['rougher.output.concentrate_au'] - train['rougher.output.tail_au'])
      ) * 100)
    .tolist()
})
In [59]:
data.sample(7)
Out[59]:
auto_estimated_recovery recalculated_recovery
13853 93.189832 93.189832
14275 89.600154 89.600154
3889 84.106063 84.106063
10087 81.037128 81.037128
288 80.930498 80.930498
13067 89.498303 89.498303
4105 86.456387 86.456387

Сравним полученные значения со значениями, автоматически рассчитанными в ходе технологического процесса.
Для оценки различий используем среднее абсолютное отклонение между значениями.

In [60]:
format(mean_absolute_error(data['auto_estimated_recovery'],
                           data['recalculated_recovery']), '.1g')
Out[60]:
'1e-14'

Среднее абсолютное отклонение между рассчитанными значениями и значениями, полученными в ходе выполнения технологического процесса, находится на уровне $1\cdot10^{-14}$. Значение близко к нулю, а это значит, что можно доверять значениям коэффициента извлечения, рассчитанным на производстве. Следовательно, эти значения можно использовать при построении модели.

Значение среднего абсолютного отклонения близко к нулю, но всё же не ноль. На это могут оказывать влияние аномальные значения содержания золота, которые присутствуют в наборе данных. Также это может быть связано с конечным числом знаков после запятой для хранящихся в памяти измерительного оборудования вещественных чисел.

Промежуточный вывод

  • В наборе данных наблюдаются аномальные значения, противоречащие физической природе данных, пропуски в данных.
  • Необходимо провести предварительную обработку данных:
    • отредактировать/удалить сведения, содержащие аномальные значения, сильно отклоняющиеся значения,
    • заполнить пропуски подходящими значениями.

Предобработка данных¶

Поскольку все значения признака date являются уникальными, их можно использовать в качестве индексов.
Значения расчётных признаков (кроме коэффициентов извлечения) не потребуются для анализа и построения модели, их можно удалить из наборов данных.

In [61]:
for name in data_dict:
    data_dict[name].set_index('date', inplace=True)
    data_dict[name].drop(
        data_dict[name].loc[:, data_dict[name].columns.str.contains('calculation')]
        .columns,
        axis=1,
        inplace=True)

Для удобной работы с тестовой выборкой сделаем срез набора данных full по индексам набора данных test.

In [62]:
test = full.loc[test.index.tolist()]

Проверим, что получилось.

In [63]:
test.shape
Out[63]:
(4860, 82)
In [64]:
train.shape
Out[64]:
(14579, 82)
In [65]:
full.shape
Out[65]:
(19439, 82)

Контрольная сумма:

In [66]:
test.shape[0] + train.shape[0]
Out[66]:
19439

Обработка аномальных значений¶

In [67]:
data_dict = {'train': train,
             'test': test,
             'full': full}

*Содержание металлов и солей в потоках*

Среди значений содержания металлов и солей аномальными являются значения 0, 0,01.

Чтобы не исказить набор данных и значение целевого признака, удалим записи с аномальными значениями.

In [68]:
for name in data_dict:
    for metall in ['au', 'ag', 'pb', 'sol']:
        for column in data_dict[name].loc[:, data_dict[name].columns.str.contains(metall)].columns:
            data_dict[name].drop(
                data_dict[name].loc[data_dict[name][column] <= 0.01001].index,
                axis=0,
                inplace=True)

Проверим, что получилось.

In [69]:
test.shape
Out[69]:
(4683, 82)
In [70]:
train.shape
Out[70]:
(13110, 82)
In [71]:
full.shape
Out[71]:
(17793, 82)

Контрольная сумма:

In [72]:
test.shape[0] + train.shape[0]
Out[72]:
17793

*Вспомогательные вещества*

Среди значений содержания вспомогательных веществ встречаются аномальные значения 0, 40 и значения, близкие к нулю (< 0,001).

Чтобы не исказить набор данных, удалим записи с аномальными значениями.

In [73]:
for name in data_dict:
    for subtance in ['sulfate', 'xanthate', 'depressant']:
        for column in data_dict[name].loc[:, data_dict[name].columns.str.contains(subtance)].columns:
            data_dict[name].drop(
                data_dict[name].loc[data_dict[name][column] <= 0.001].index |
                data_dict[name].loc[data_dict[name][column] == 40].index,
                axis=0,
                inplace=True)
<ipython-input-73-58d285c9fc56>:5: FutureWarning: Index.__or__ operating as a set operation is deprecated, in the future this will be a logical operation matching Series.__or__.  Use index.union(other) instead.
  data_dict[name].loc[data_dict[name][column] <= 0.001].index |

Проверим, что получилось.

In [74]:
test.shape
Out[74]:
(4680, 82)
In [75]:
train.shape
Out[75]:
(13087, 82)
In [76]:
full.shape
Out[76]:
(17767, 82)

Контрольная сумма:

In [77]:
test.shape[0] + train.shape[0]
Out[77]:
17767

Скорость потока

Среди значений скорости потока встречаются аномальные значения (< 5).

Чтобы не исказить набор данных, удалим записи с аномальными значениями.

In [78]:
for name in data_dict:
    data_dict[name].drop(
        data_dict[name].loc[data_dict[name]['rougher.input.feed_rate'] < 5].index,
        axis=0,
        inplace=True)

Проверим, что получилось.

In [79]:
test.shape
Out[79]:
(4668, 82)
In [80]:
train.shape
Out[80]:
(13063, 82)
In [81]:
full.shape
Out[81]:
(17731, 82)

Контрольная сумма:

In [82]:
test.shape[0] + train.shape[0]
Out[82]:
17731

Размер частиц

Среди значений размера частиц встречаются аномальные значения (< 1).

Чтобы не исказить набор данных, удалим записи с аномальными значениями.

In [83]:
for name in data_dict:
    data_dict[name].drop(
        data_dict[name].loc[data_dict[name]['rougher.input.feed_size'] < 1].index,
        axis=0,
        inplace=True)

Проверим, что получилось.

In [84]:
test.shape
Out[84]:
(4667, 82)
In [85]:
train.shape
Out[85]:
(13060, 82)
In [86]:
full.shape
Out[86]:
(17727, 82)

Контрольная сумма:

In [87]:
test.shape[0] + train.shape[0]
Out[87]:
17727

Объём подаваемого воздуха

Среди значений объёма подаваемого во флотатор воздуха встречаются аномальные значения (< 0,1 для признаков secondary_cleaner.state.floatbank(n)_(a,b)_air и < 100 для признаков rougher.state.floatbank10_(a,b,c,d,e,f)_air и primary_cleaner.state.floatbank8_(a,b,c,d)_air).

Чтобы не исказить набор данных, удалим записи с аномальными значениями.

In [88]:
for name in data_dict:
    for column in data_dict[name].loc[:, data_dict[name].columns.str.contains('air') &
                                      data_dict[name].columns.str.contains('secondary_cleaner.state.floatbank')
                                      ].columns:
        data_dict[name].drop(
            data_dict[name].loc[data_dict[name][column] < 0.1].index,
            axis=0,
            inplace=True)

Проверим, что получилось.

In [89]:
test.shape
Out[89]:
(4626, 82)
In [90]:
train.shape
Out[90]:
(12936, 82)
In [91]:
full.shape
Out[91]:
(17562, 82)

Контрольная сумма:

In [92]:
test.shape[0] + train.shape[0]
Out[92]:
17562
In [93]:
for name in data_dict:
    for column in data_dict[name].loc[:, data_dict[name].columns.str.contains('air') &
                                      (data_dict[name].columns.str.contains('primary_cleaner.state.floatbank8') |
                                       data_dict[name].columns.str.contains('rougher.state.floatbank10'))
                                      ].columns:
        data_dict[name].drop(
            data_dict[name].loc[data_dict[name][column] < 100].index,
            axis=0,
            inplace=True)

Проверим, что получилось.

In [94]:
test.shape
Out[94]:
(4626, 82)
In [95]:
train.shape
Out[95]:
(12933, 82)
In [96]:
full.shape
Out[96]:
(17559, 82)

Контрольная сумма:

In [97]:
test.shape[0] + train.shape[0]
Out[97]:
17559

Уровень жидкости во флотаторе

Среди значений уровня жидкости во флотаторе встречаются сильно отклоняющиеся значения (> −100).

Чтобы не исказить набор данных, удалим записи с такими значениями.

In [98]:
for name in data_dict:
    for column in data_dict[name].loc[:, data_dict[name].columns.str.contains('level')].columns:
        data_dict[name].drop(
            data_dict[name].loc[data_dict[name][column] > -100].index,
            axis=0,
            inplace=True)

Проверим, что получилось.

In [99]:
test.shape
Out[99]:
(4626, 82)
In [100]:
train.shape
Out[100]:
(12929, 82)
In [101]:
full.shape
Out[101]:
(17555, 82)

Контрольная сумма:

In [102]:
test.shape[0] + train.shape[0]
Out[102]:
17555

Обработка пропусков¶

In [103]:
for name in data_dict:
    print('Количество пропущенных значения набора данных', name,
          'составляет', data_dict[name].isna().sum().sum())
Количество пропущенных значения набора данных train составляет 2080
Количество пропущенных значения набора данных test составляет 1375
Количество пропущенных значения набора данных full составляет 3455

Поскольку наблюдения регистрируются непрерывно, величины принимают непрерывные значения и изменяются непрерывно, пропуски можно заполнить предыдущими действительными значениями временного ряда.

In [104]:
for name in data_dict:
    data_dict[name].fillna(method='ffill', inplace=True)
In [105]:
for name in data_dict:
    print('Количество пропущенных значения набора данных', name,
          'составляет', data_dict[name].isna().sum().sum())
Количество пропущенных значения набора данных train составляет 0
Количество пропущенных значения набора данных test составляет 0
Количество пропущенных значения набора данных full составляет 0

Промежуточный вывод

  • Выполнена предварительная обработка данных.
  • В результате предварительной обработки данных:
    • удалены аномальные значения, противоречащие физической природе данных,
    • удалены сильно отклоняющиеся значения признаков,
    • заполнены пропуски наиболее подходящим значением,
    • сохранено 90 % записей исходного набора данных.

Исследовательский анализ данных¶

Предварительно зададим функцию, выводящую описательные статистики.

In [106]:
def descriptive_statistics(values, label, column_name):
    '''
    Описательная статистика переменной, измеряемой в количественной шкале.

    Принимает значения признака, название признака и общее название колонок.
    Возвращает DataFrame с набором статистик.

    '''

    df = pd.DataFrame([
        values.count(),
        len(values.unique()),
        values.min(),
        values.median() - 1.5 * (values.quantile(q=.75) -
                                 values.quantile(q=.25)),
        values.quantile(q=.25).round(2),
        (values.mode()).to_list(),
        values.median().round(2),
        values.mean().round(2),
        values.quantile(q=.75).round(2),
        values.median() + 1.5 * (values.quantile(q=.75) -
                                 values.quantile(q=.25)),
        values.max(),
        values.max() - values.min(),
        values.quantile(q=.75) - values.quantile(q=.25)
    ],
        index=['кол-во значений', 'кол-во уникальных', 'мин.',
               '-1.5IQR', '25 %', 'мода', 'медиана',
               'среднее ариф.', '75 %', '+1.5IQR', 'макс.',
               'размах', 'межквартильный размах'],
        columns=[label]).rename_axis(column_name, axis=1)

    return df

Изменение содержания металлов в основном потоке¶

Извлечение золота¶

In [107]:
col_name = 'Содержание золота в потоках, усл. ед.'
descriptive_statistics(
    full['rougher.input.feed_au'], 'В сырье', col_name).join(
descriptive_statistics(
    full['rougher.output.concentrate_au'], 'Со стадии флотации', col_name)).join(
descriptive_statistics(
    full['primary_cleaner.output.concentrate_au'], 'Со стадии очистки 1', col_name)).join(
descriptive_statistics(
    full['final.output.concentrate_au'], 'Во флотоконцентрате', col_name))
Out[107]:
Содержание золота в потоках, усл. ед. В сырье Со стадии флотации Со стадии очистки 1 Во флотоконцентрате
кол-во значений 17555 17555 17555 17555
кол-во уникальных 17543 17544 17543 17543
мин. 0.885875 1.889855 0.05659 3.911529
-1.5IQR 3.673437 16.101152 26.09429 40.766088
25 % 6.82 18.93 30.57 43.42
мода [7.495525360107423] [18.65237236022949] [30.35080909729004] [46.10503005981445]
медиана 8.07 20.31 32.89 45.01
среднее ариф. 8.24 20.19 32.54 44.33
75 % 9.74 21.73 35.1 46.25
+1.5IQR 12.458585 24.522948 39.680395 49.254085
макс. 13.524339 28.824507 45.933934 51.571885
размах 12.638465 26.934652 45.877344 47.660355
межквартильный размах 2.928382 2.807266 4.528702 2.829332
In [108]:
columns = ['rougher.input.feed_au',
           'rougher.output.concentrate_au',
           'primary_cleaner.output.concentrate_au',
           'final.output.concentrate_au']
label = ['в сырье',
         'со стадии флотации',
         'со стадии очистки 1',
         'во флотоконцентрате']


fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
ax1.set_title('Диаграмма распределения частот и диаграмма размаха' +
              '\nзначений содержания золота в потоках')
for column in columns:
    ax1.hist(full[column], bins=100, alpha=0.5)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax1.legend(label)
ax2.boxplot(full[columns], vert=False)
ax2.set_yticks(ticks=[1,2,3,4], labels=label)
ax2.set_xlabel('Содержание золота, усл. ед.')
plt.show()
  • При движении руды по технологическому процессу содержание золота в ней растёт.
  • В сырье среднее содержание золота составляет 8 усл. ед., в концентрате, выходящем со стадии флотации — уже 20 усл. ед. После стадии очистки 1 содержание золота поднимается до 33 усл. ед., а в финальном концентрате его содержится 45 усл. ед.
  • Распределения значений содержания золота в концентратах являются унимодальными. Концентрат, выходящий со стадии очистки 1, имеет более широкое распределение значений содержания золота, нежели концентрат, выходящий со стадии флотации и поступающий на стадию очистки 1. У распределения наблюдается длинный "хвост" слева. Однако после стадии очистки 2 концентрат (финальный) имеет более узкое распределение, хоть и сохраняет длинный "хвост" слева.
  • Поскольку на диаграмме размаха "усы" каждого следующего распределения (получаемого при движении по технологическому процессу) перекрываются лишь небольшой своей частью, можно говорить о значительном обогащении руды после каждой из рассматриваемых стадий.

Извлечение серебра¶

In [109]:
col_name = 'Содержание серебра в потоках, усл. ед.'
descriptive_statistics(
    full['rougher.input.feed_ag'], 'В сырье', col_name).join(
descriptive_statistics(
    full['rougher.output.concentrate_ag'], 'Со стадии флотации', col_name)).join(
descriptive_statistics(
    full['primary_cleaner.output.concentrate_ag'], 'Со стадии очистки 1', col_name)).join(
descriptive_statistics(
    full['final.output.concentrate_ag'], 'Во флотоконцентрате', col_name))
Out[109]:
Содержание серебра в потоках, усл. ед. В сырье Со стадии флотации Со стадии очистки 1 Во флотоконцентрате
кол-во значений 17555 17555 17555 17555
кол-во уникальных 17543 17544 17543 17542
мин. 1.226494 0.905993 0.018661 0.434375
-1.5IQR 3.998592 7.513205 4.725311 2.610401
25 % 7.19 10.68 7.29 4.25
мода [5.753713130950928] [9.252737045288086] [8.33973217010498] [3.5720245838165283]
медиана 8.54 12.11 8.52 5.04
среднее ариф. 8.77 12.21 8.54 5.18
75 % 10.22 13.74 9.82 5.87
+1.5IQR 13.080233 16.707848 12.323826 7.469304
макс. 14.596026 21.725695 16.081632 16.001945
размах 13.369532 20.819702 16.062971 15.56757
межквартильный размах 3.027214 3.064881 2.532838 1.619634
In [110]:
columns = ['rougher.input.feed_ag',
           'rougher.output.concentrate_ag',
           'primary_cleaner.output.concentrate_ag',
           'final.output.concentrate_ag']
label = ['в сырье',
         'со стадии флотации',
         'со стадии очистки 1',
         'во флотоконцентрате']


fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
ax1.set_title('Диаграмма распределения частот и диаграмма размаха' +
              '\nзначений содержания серебра в потоках')
for column in columns:
    ax1.hist(full[column], bins=100, alpha=0.5)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax1.legend(label)
ax2.boxplot(full[columns], vert=False)
ax2.set_yticks(ticks=[1,2,3,4], labels=label)
ax2.set_xlabel('Содержание серебра, усл. ед.')
plt.show()
  • При движении руды по технологическому процессу содержание серебра в ней изменяется не монотонно. В концентрате после стадии флотации содержание серебра в среднем больше, чем было до прохождения стадии (в сырье). Однако после следующих стадий обогащения содержание серебра в концентрате снижается.
  • В сырье среднее содержание серебра составляет 8,5 усл. ед., в концентрате, выходящем со стадии флотации — уже 12 усл. ед. После стадии очистки 1 содержание серебра снижается до 8,5 усл. ед., а в финальном концентрате его содержание составляет всего 5 усл. ед.
  • Распределения значений содержания серебра в концентратах являются унимодальными, уширенными, с длинными "хвостами" справа и слева. Тем не менее, можно утверждать, что в финальном флотоконцентрате распределение становится уже: межквартильный размах составляет 1,6 (против 2,5–3 для распределений предыдущих стадий).
  • Поскольку на диаграмме размаха "усы" каждого следующего распределения (получаемого при движении по технологическому процессу) перекрываются значительно (вследствие уширенности распределений), можно говорить о качественном изменении содержания серебра после каждой стадии обогащения, лишь опираясь на 50 % значений, сгруппированных вокруг медианного значения (попадающих в "ящик" диаграммы размаха). "Ящики" а диаграммах размаха не перекрываются.

Извлечение свинца¶

In [111]:
col_name = 'Содержание свинца в потоках, усл. ед.'
descriptive_statistics(
    full['rougher.input.feed_pb'], 'В сырье', col_name).join(
descriptive_statistics(
    full['rougher.output.concentrate_pb'], 'Со стадии флотации', col_name)).join(
descriptive_statistics(
    full['primary_cleaner.output.concentrate_pb'], 'Со стадии очистки 1', col_name)).join(
descriptive_statistics(
    full['final.output.concentrate_pb'], 'Во флотоконцентрате', col_name))
Out[111]:
Содержание свинца в потоках, усл. ед. В сырье Со стадии флотации Со стадии очистки 1 Во флотоконцентрате
кол-во значений 17555 17555 17555 17555
кол-во уникальных 17469 17492 17444 17514
мин. 0.088552 0.629964 0.021357 0.893524
-1.5IQR 1.438061 5.075326 6.112574 7.270977
25 % 2.86 6.8 8.73 9.17
мода [0.088552105876491] [8.4521484375] [6.433844609260559] [11.4521484375]
медиана 3.52 7.77 10.2 10.14
среднее ариф. 3.58 7.77 9.94 10.07
75 % 4.24 8.59 11.45 11.08
+1.5IQR 5.594044 10.469561 14.278947 13.015063
макс. 7.142594 13.617072 17.081278 17.031899
размах 7.054042 12.987108 17.059922 16.138375
межквартильный размах 1.385328 1.798078 2.722124 1.914695
In [112]:
columns = ['rougher.input.feed_pb',
           'rougher.output.concentrate_pb',
           'primary_cleaner.output.concentrate_pb',
           'final.output.concentrate_pb']
label = ['в сырье',
         'со стадии флотации',
         'со стадии очистки 1',
         'во флотоконцентрате']


fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
ax1.set_title('Диаграмма распределения частот и диаграмма размаха' +
              '\nзначений содержания свинца в потоках')
for column in columns:
    ax1.hist(full[column], bins=100, alpha=0.5)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax1.legend(label)
ax2.boxplot(full[columns], vert=False)
ax2.set_yticks(ticks=[1,2,3,4], labels=label)
ax2.set_xlabel('Содержание свинца, усл. ед.')
plt.show()
  • При движении руды по технологическому процессу содержание свинца в ней изменяется монотонно. В концентратах после каждой из стадий флотации и очистки 1 содержание свинца увеличивается, а после стадии очистки 2 уже не изменяется. Хотя ширина распределения всё же уменьшается.
  • В сырье среднее содержание свинца составляет 3,5 усл. ед., в концентрате, выходящем со стадии флотации — уже 8 усл. ед. После стадии очистки 1 содержание свинца увеличивается до 10 усл. ед. и сохраняется таковым до получения финального флотоконцентрата.
  • Распределения значений содержания свинца в концентратах являются практически унимодальными, уширенными, с длинными "хвостами" справа и слева. Самое узкое распределение значений содержания свинца в исходном сырье.
  • Поскольку на диаграмме размаха "усы" каждого следующего распределения (получаемого при движении по технологическому процессу) так же, как и в случае с серебром, перекрываются значительно (вследствие уширенности распределений), можно говорить о качественном изменении содержания свинца после каждой стадии обогащения, лишь опираясь на 50 % значений, сгруппированных вокруг медианного значения (попадающих в "ящик" диаграммы размаха). "Ящики" а диаграммах размаха не перекрываются, но после стадий очистки 1 и очистки 2 располагаются в одном месте числовой прямой, только "ящик" у финального концентрата уже.

Таким образом, в результате флотационного обогащения с непрерывным ростом содержания золота, в среднем, до значения 45 усл. ед., содержание свинца растёт и достигает, в среднем, значения 10 усл. ед., содержание серебра сначала растёт, а затем снижается и в финальном флотоконцентрате составляет всего 5 усл. ед.

Изменение суммарного содержания металлов в основном потоке¶

In [113]:
full['rougher.input.feed_me'] = full['rougher.input.feed_au'] + \
full['rougher.input.feed_ag'] + full['rougher.input.feed_pb']

full['rougher.output.concentrate_me'] = full['rougher.output.concentrate_au'] + \
full['rougher.output.concentrate_ag'] + full['rougher.output.concentrate_pb']

full['primary_cleaner.output.concentrate_me'] = \
full['primary_cleaner.output.concentrate_au'] + \
full['primary_cleaner.output.concentrate_ag'] + \
full['primary_cleaner.output.concentrate_pb']

full['final.output.concentrate_me'] = full['final.output.concentrate_au'] + \
full['final.output.concentrate_ag'] + full['final.output.concentrate_pb']
In [114]:
col_name = 'Содержание металлов в потоках, усл. ед.'
descriptive_statistics(
    full['rougher.input.feed_me'], 'В сырье', col_name).join(
descriptive_statistics(
    full['rougher.output.concentrate_me'], 'Со стадии флотации', col_name)).join(
descriptive_statistics(
    full['primary_cleaner.output.concentrate_me'], 'Со стадии очистки 1', col_name)).join(
descriptive_statistics(
    full['final.output.concentrate_me'], 'Во флотоконцентрате', col_name))
Out[114]:
Содержание металлов в потоках, усл. ед. В сырье Со стадии флотации Со стадии очистки 1 Во флотоконцентрате
кол-во значений 17555 17555 17555 17555
кол-во уникальных 17543 17544 17543 17543
мин. 3.105904 3.425813 0.096607 5.239429
-1.5IQR 10.051899 34.54811 47.076217 57.614079
25 % 17.15 38.49 50.14 59.29
мода [17.47531270980835] [37.66975784301758] [52.89268970489502] [62.25420308113098]
медиана 19.98 40.33 51.96 60.29
среднее ариф. 20.58 40.18 51.02 59.58
75 % 23.77 42.35 53.39 61.07
+1.5IQR 29.911126 46.105076 56.833788 62.965424
макс. 33.498784 49.700943 60.106566 64.968881
размах 30.39288 46.27513 60.009959 59.729452
межквартильный размах 6.619742 3.852322 3.252524 1.783782
In [115]:
columns = ['rougher.input.feed_me',
           'rougher.output.concentrate_me',
           'primary_cleaner.output.concentrate_me',
           'final.output.concentrate_me']
label = ['в сырье',
         'со стадии флотации',
         'со стадии очистки 1',
         'во флотоконцентрате']


fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
ax1.set_title('Диаграмма распределения частот и диаграмма размаха' +
              '\nзначений содержания металлов в потоках')
for column in columns:
    ax1.hist(full[column], bins=100, alpha=0.5)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax1.legend(label)
ax2.boxplot(full[columns], vert=False)
ax2.set_yticks(ticks=[1,2,3,4], labels=label)
ax2.set_xlabel('Содержание металлов, усл. ед.')
plt.show()
  • При движении руды по технологическому процессу содержание металлов в ней растёт.
  • В сырье среднее содержание металлов составляет 20 усл. ед., в концентрате, выходящем со стадии флотации — уже 40 усл. ед. После стадии очистки 1 содержание металлов поднимается до 51 усл. ед., а в финальном концентрате их содержится 60 усл. ед.
  • Распределения значений содержания металлов в концентратах являются унимодальными. Содержание металлов в сырье имеет самое широкое распределение. Концентрат, выходящий со стадии флотации, имеет более узкое распределение значений содержания металлов (межквартильный интервал уменьшается с 6,6 до 3,8 усл. ед. — почти в два раза). У распределения наблюдается длинный "хвост" слева. После стадии очистки 1 распределение значений сохраняет свою ширину, но "хвост" распределения слева увеличивается. Однако после стадии очистки 2 концентрат (финальный) имеет ещё более узкое распределение значений (межквартильный интервал уменьшается с 3,3 до 1,8 усл. ед. — тоже почти в два раза), хоть и сохраняет длинный "хвост" слева.
  • Поскольку на диаграмме размаха "усы" каждого следующего распределения (получаемого при движении по технологическому процессу) перекрываются лишь небольшой своей частью, можно говорить о значительном обогащении руды металлами и отделении пустой породы после каждой из рассматриваемых стадий.

Изменение размеров гранул исходного сырья¶

In [116]:
col_name = 'Размер гранул сырья, усл. ед.'
descriptive_statistics(
    test['rougher.input.feed_size'], 'В тестовой выборке', col_name).join(
descriptive_statistics(
    train['rougher.input.feed_size'], 'В тренировочной выборке', col_name))
Out[116]:
Размер гранул сырья, усл. ед. В тестовой выборке В тренировочной выборке
кол-во значений 4626 12929
кол-во уникальных 4577 12852
мин. 9.659576 12.191554
-1.5IQR 27.230071 29.866792
25 % 47.66 47.32
мода [55.46105787765386] [55.1907258792174]
медиана 55.57 54.46
среднее ариф. 59.25 58.39
75 % 66.56 63.72
+1.5IQR 83.909566 79.061683
макс. 363.989699 484.967466
размах 354.330123 472.775913
межквартильный размах 18.893165 16.398297
In [117]:
label = ['В тестовой выборке', 'В тренировочной выборке']

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
ax1.set_title('Диаграмма распределения частот и диаграмма размаха' +
              '\nзначений размера гранул сырья')
ax1.hist([test['rougher.input.feed_size'].tolist(),
          train['rougher.input.feed_size'].tolist()],
         bins=50, alpha=0.7)
ax1.legend(label)
ax1.tick_params(labelbottom=False)
ax1.set_ylabel('Частота')
ax1.legend(label)
ax2.boxplot([test['rougher.input.feed_size'].tolist(),
             train['rougher.input.feed_size'].tolist()],
            vert=False)
ax2.set_yticks(ticks=[1,2], labels=label)
ax2.set_xlabel('Размер гранул сырья, усл. ед.')
plt.show()
  • Распределения значений размеров гранул сырья унимодальные, не широкие, но с длинными тонкими "хвостами" справа.
  • Медианные значения практичеки совпадают: 55,5 усл. ед. — в тестовой выборке, 54,5 усл. ед. — в тренировочной.
  • Межквартильный размах принимает схожие значения: 18,9 усл. ед. — в тестовой выборке, 16,4 усл. ед. — в тренировочной выборке.
  • Поскольку размер гранул поступающего сырья был одинаковым, можно ожидать, что прогнозные оценки моделей будут правильными.
In [118]:
label = ['В тестовой выборке', 'В тренировочной выборке']

plt.figure(figsize=(10, 3))
plt.title('График ядерной оценки плотности распределения')
sns.kdeplot(test['rougher.input.feed_size'])
sns.kdeplot(train['rougher.input.feed_size'])
plt.xlabel('Размер гранул сырья, усл. ед.')
plt.ylabel('Плотность распределения')
plt.legend(label)
plt.ylim(-0.0005, 0.037)
plt.xlim(0, 495)
plt.show()
  • На графиках ядерной оценки плотности распределения значений размера гранул сырья в тестовой и тренировочной выборках можно наблюдать одинаковое расположение максимумов (примерно 55 усл. ед.). Кроме того, на обоих графиках отчётливо видно наличие плеч справа, имеющих также близкое расположение (около 80 усл. ед.).

Промежуточный вывод

  • В результате процесса флотационного обогащения суммарное содержание металлов в концентрате в среднем увеличивается с 20 до 60 усл. ед., причём
    • содержание золота в концентрате в среднем растёт с 8 до 45 усл. ед.,
    • содержание серебра в концентрате в среднем снижается с 8,5 до 5 усл. ед.,
    • содержание свинца в концентрате в среднем растёт с 3,5 до 10 усл. ед.
  • Размер гранул сырья до стадии флотации и после неё остаётся неизменным.

Построение моделей¶

Разделение данных на выборки¶

Выделение признаков для формирования тестовой и тренировочной выборок¶

Поскольку, как уже отмечалось ранее, в тестовой выборке нет сведений о содержании металлов в концентратах и отходах на каждой стадии, признаки, характеризующие эти содержания не будут включены в обучение моделей.

In [119]:
test.drop(test.loc[:, test.columns.str.contains('concentrate') |
                   test.columns.str.contains('tail') |
                   test.columns.str.contains('recovery')].columns,
          axis=1,
          inplace=True)
train = train.loc[:, test.columns.tolist()]

Посмотрим, что получилось.

In [120]:
test.shape
Out[120]:
(4626, 52)
In [121]:
train.shape
Out[121]:
(12929, 52)

Выделение признаков, влияющих на прогноз значения коэффициента извлечения на стадии флотации¶

Поскольку на качество обогащения руды на стадии флотации влияют только параметры, характеризующие входящие на эту стадию потоки, обучение модели для прогнозирования коэффициента обогащения на стадии флотации будем проводить на признаках, характеризующих входящий на стадию основной поток, вспомогательные вещества и параметры работы технологического оборудования.

In [122]:
columns_model_rougher = test.loc[:, test.columns.str.contains('rougher')].columns
columns_model_rougher.tolist()
Out[122]:
['rougher.input.feed_au',
 'rougher.input.feed_ag',
 'rougher.input.feed_pb',
 'rougher.input.feed_sol',
 'rougher.input.feed_rate',
 'rougher.input.feed_size',
 'rougher.input.floatbank10_sulfate',
 'rougher.input.floatbank10_xanthate',
 'rougher.state.floatbank10_a_air',
 'rougher.state.floatbank10_a_level',
 'rougher.state.floatbank10_b_air',
 'rougher.state.floatbank10_b_level',
 'rougher.state.floatbank10_c_air',
 'rougher.state.floatbank10_c_level',
 'rougher.state.floatbank10_d_air',
 'rougher.state.floatbank10_d_level',
 'rougher.state.floatbank10_e_air',
 'rougher.state.floatbank10_e_level',
 'rougher.state.floatbank10_f_air',
 'rougher.state.floatbank10_f_level',
 'rougher.input.floatbank11_sulfate',
 'rougher.input.floatbank11_xanthate']

В каждом наборе данных выделим целевой признак rougher.output.recovery.

In [123]:
features_rougher_train = train[columns_model_rougher]
target_rougher_train = full.loc[train.index.tolist(), 'rougher.output.recovery']

features_rougher_test = test[columns_model_rougher]
target_rougher_test = full.loc[test.index.tolist(), 'rougher.output.recovery']

Посмотрим, что получилось.

In [124]:
features_rougher_train.shape
Out[124]:
(12929, 22)
In [125]:
features_rougher_test.shape
Out[125]:
(4626, 22)
In [126]:
features_final_train = train
target_final_train = full.loc[train.index, 'final.output.recovery']

features_final_test = test
target_final_test = full.loc[test.index, 'final.output.recovery']

Посмотрим, что получилось.

In [127]:
features_final_train.shape
Out[127]:
(12929, 52)
In [128]:
features_final_test.shape
Out[128]:
(4626, 52)

Функция расчёта метрики качества моделей¶

Оценку качества обученных моделей будем проводить с использованием симметричного среднего абсолютного процентного отклонения, которое рассчитывается по формуле:

$sMAPE = \frac{2}{N}\sum\limits_{i=1}^N \frac{|y_i - y_{pred,i}|}{|y_i| + |y_{pred,i}|} \cdot 100\%$,

где $y_i$ — значение целевого признака для объекта с порядковым номером $i$ в выборке, на которой измеряется качество,
$y_{pred, i}$ — значение предсказания для объекта с порядковым номером $i$ в выборке,
$N$ — количество объектов в выборке,
$i=1...N$.

Функция схожа со средним абсолютным отклонением, одинаково учитывает масштаб и целевого признака, и предсказания и выражается в процентах.

In [129]:
def smape_score(target, predictions):
    '''
    Функция рассчитывает значение sMAPE.

    Принимает значения целевого признака и значения предсказания.
    Возвращает значение метрики sMAPE (в %).
    '''

    df = pd.DataFrame({'target': target.tolist(),
                       'predictions': predictions.tolist()})

    score = 2 * np.sum(
        abs(df['target'] - df['predictions']) /
        (abs(df['target']) + abs(df['predictions']))) / len(df) * 100

    return score
In [130]:
def scoring():

    return make_scorer(smape_score, greater_is_better=False)

Качество предсказаний будем рассчитывать по значению итоговой метрики, которая рассчитывается по формуле:

$Итоговое\ sMAPE = 0,25 \cdot sMAPE(rougher) + 0,75 \cdot sMAPE(final)$,

где $sMAPE(rougher)$ — значение метрики sMAPE, рассчитанной для модели, прогнозирующей коэффициент извлечения на стадии флотации,
$sMAPE(final)$ — значение метрики sMAPE, рассчитанной для модели, прогнозирующей коэффициент извлечения для всего процесса флотационного обогащения.

In [131]:
def smape_final(rougher_target, final_target,
                rougher_predictions, final_predictions):
    '''
    Функция рассчитывает итоговое sMAPE для процесса флотационного обогащения.

    Принимает две обученные модели, два набора признаков для обучения
    и два целевых признака.
    Возвращает значение итоговой метрики (в %).
    '''

    score = 0.25 * smape_score(rougher_target, rougher_predictions) + \
            0.75 * smape_score(final_target, final_predictions)

    return round(score, 2)

Обучение моделей¶

Поскольку целевые признаки rougher.output.recovery и final.output.recovery — количественные, непрерывные, следовательно, необходимо решить задачу регрессии.

Для того чтобы получить максимально высокое качество предсказания, нужно перебрать в алгоритмах обучения разные значения гиперпараметров.

Наилучшими гиперпараметрами для моделей регрессии признаем те, при которых получится минимальное значение итогового sMAPE обученной модели, оценённого на валидационной выборке.

Подбор параметров моделей и оценку качества обучаемых моделей будем производить кросс-валидацией. Подвыборки будем формировать схожими по размеру тестовой выборке. Для этого рассчитаем отношение количества объектов в тренировочной выборке к количеству объектов в тестовой выборке.

In [132]:
round(train.shape[0]/test.shape[0])
Out[132]:
3

Таким образом, количество формируемых подвыборок для обучения одной модели равно 3.

In [133]:
CV = 3

Решающее дерево¶

In [134]:
%%time

MAX_TREE_DEPTH = 6

best_model_rougher_dtr = None
best_model_final_dtr = None
best_model_dtr_score = 100
best_tree_depth = 0

for depth in [None]+[i for i in range(1, MAX_TREE_DEPTH+1)]:
    model_rougher_dtr = DecisionTreeRegressor(max_depth=depth,
                                              random_state=RANDOM_STATE)
    model_final_dtr = DecisionTreeRegressor(max_depth=depth,
                                            random_state=RANDOM_STATE)

    model_dtr_score = 0.25 * cross_val_score(
                          model_rougher_dtr,
                          X=features_rougher_train,
                          y=target_rougher_train,
                          cv=CV,
                          scoring=scoring(),
                          n_jobs=-1).mean() + \
                      0.75 * cross_val_score(
                          model_final_dtr,
                          X=features_final_train,
                          y=target_final_train,
                          cv=CV,
                          scoring=scoring(),
                          n_jobs=-1).mean()

    if abs(model_dtr_score) < best_model_dtr_score:
        best_model_rougher_dtr = model_rougher_dtr
        best_model_final_dtr = model_rougher_dtr
        best_model_dtr_score = abs(model_dtr_score)
        best_tree_depth = depth

print('Модель решающего дерева')
print('Глубина дерева:', best_tree_depth)
print('sMAPE:', round(best_model_dtr_score, 2), '%')
Модель решающего дерева
Глубина дерева: 2
sMAPE: 8.6 %
CPU times: user 711 ms, sys: 130 ms, total: 841 ms
Wall time: 11.6 s

Случайный лес¶

In [135]:
%%time

MAX_TREE_NUMBER = 100
MAX_TREE_DEPTH = 6

best_model_rougher_rfr = None
best_model_final_rfr = None
best_model_rfr_score = 100
best_tree_number = 0
best_tree_depth = 0

for est in range(10, MAX_TREE_NUMBER+1, 10):
    for depth in [None]+[i for i in range(1, MAX_TREE_DEPTH+1)]:
        model_rougher_rfr = RandomForestRegressor(n_estimators=est,
                                                  max_depth=depth,
                                                  random_state=RANDOM_STATE,
                                                  n_jobs=-1)
        model_final_rfr = RandomForestRegressor(n_estimators=est,
                                                max_depth=depth,
                                                random_state=RANDOM_STATE,
                                                n_jobs=-1)

        model_rfr_score = 0.25 * cross_val_score(
                              model_rougher_rfr,
                              X=features_rougher_train,
                              y=target_rougher_train,
                              cv=CV,
                              scoring=scoring(),
                              n_jobs=-1).mean() + \
                          0.75 * cross_val_score(
                              model_final_rfr,
                              X=features_final_train,
                              y=target_final_train,
                              cv=CV,
                              scoring=scoring(),
                              n_jobs=-1).mean()

        if abs(model_rfr_score) < best_model_rfr_score:
            best_model_rougher_rfr = model_rougher_rfr
            best_model_final_rfr = model_final_rfr
            best_model_rfr_score = abs(model_rfr_score)
            best_tree_number = est
            best_tree_depth = depth

print('Модель случайного леса')
print('Количество деревьев в лесу:', best_tree_number)
print('Глубина каждого дерева:', best_tree_depth)
print('sMAPE:', round(best_model_rfr_score, 2), '%')
Модель случайного леса
Количество деревьев в лесу: 80
Глубина каждого дерева: 2
sMAPE: 8.49 %
CPU times: user 26 s, sys: 4.12 s, total: 30.1 s
Wall time: 40min 48s

Линейная регрессия¶

In [136]:
%%time

model_rougher_lr = LinearRegression(n_jobs=-1)
model_final_lr = LinearRegression(n_jobs=-1)

model_lr_score = 0.25 * cross_val_score(
                    model_rougher_lr,
                    X=features_rougher_train,
                    y=target_rougher_train,
                    cv=CV,
                    scoring=scoring(),
                    n_jobs=-1).mean() + \
                 0.75 * cross_val_score(
                    model_final_lr,
                    X=features_final_train,
                    y=target_final_train,
                    cv=CV,
                    scoring=scoring(),
                    n_jobs=-1).mean()

print('Модель линейной регрессии')
print('sMAPE', round(abs(model_lr_score), 2), '%')
Модель линейной регрессии
sMAPE 9.88 %
CPU times: user 95.3 ms, sys: 8.55 ms, total: 104 ms
Wall time: 466 ms

Промежуточный вывод

  • Лучшей моделью является модель случайного леса с количеством деревьев — 80 и глубиной одного дерева — 2.
  • Значение симметричного среднего абсолютного процентного отклонения для этой модели достигает наименьшего значения и составляет 8,49 %.

Оценка моделей¶

In [137]:
best_model_rougher_rfr.fit(features_rougher_train, target_rougher_train)
best_model_final_rfr.fit(features_final_train, target_final_train)

rougher_predictions_rfr = best_model_rougher_rfr.predict(features_rougher_test)
final_predictions_rfr = best_model_final_rfr.predict(features_final_test)

smape = smape_final(target_rougher_test, target_final_test,
                    rougher_predictions_rfr, final_predictions_rfr)

print('Модель случайного леса')
print('Количество деревьев в лесу: 80')
print('Глубина каждого дерева: 2')
print('sMAPE:', smape, '%')
Модель случайного леса
Количество деревьев в лесу: 80
Глубина каждого дерева: 2
sMAPE: 7.5 %

Оценка адекватности моделей¶

Чтобы оценить адекватность моделей (проверить их на вменяемость), нужно сравнить обученные модели со случайной. Поскольку признаки rougher.output.recovery и final.output.recovery являются непрерывными, наиболее простой моделью, пресказывающей коэффициент извлечения золота, будет такая, которая предсказывает среднее арифметическое значение.

In [138]:
STRATEGY = 'mean'

model_rougher_dr = DummyRegressor(strategy=STRATEGY)
model_final_dr = DummyRegressor(strategy=STRATEGY)

model_rougher_dr.fit(X=features_rougher_train, y=target_rougher_train)
model_final_dr.fit(X=features_final_train, y=target_final_train)

target_rougher_predicted_dr = model_rougher_dr.predict(X=features_rougher_test)
target_final_predicted_dr = model_final_dr.predict(X=features_final_test)

smape = smape_final(target_rougher_test, target_final_test,
                    target_rougher_predicted_dr, target_final_predicted_dr)

print('Простая модель, предсказывающая среднее арифметическое значение')
print('sMAPE:', smape, '%')
Простая модель, предсказывающая среднее арифметическое значение
sMAPE: 8.35 %

Промежуточный вывод

  • Простая модель, предсказывающая среднее арифметическое значение, показывает значение sMAPE равное 8,35 %, что хуже значения sMAPE 7,5 %, которое показывает обученная модель случайного леса с количеством деревьев — 80 и глубиной каждого дерева — 2.

Общий вывод¶

Были обучены модели регрессии: решающее дерево, случайный лес, линейная регрессия.

  • Для алгоритмов было обучено несколько моделей с различными гиперпараметрами.
  • Критерием выбора лучшей модели было минимальное среднее значение итогового sMAPE, рассчитанное на валидационных выборках при выполнении кросс-валидации.
    Оно составило:
    • для решающего дерева — 8,60 %;
    • для случайного леса — 8,49 %;
    • для линейной регресии — 9,88 %.
  • Минимальное значение итогового sMAPE (8,49 %) достигнуто для модели случайного леса: количество деревьев в лесу — 80, максимальная глубина дерева — 2.
  • Модель решающего дерева с максимальной глубиной дерева — 2 имеет не сильно отличающееся значение итогового sMAPE — 8,6 %.
  • Большее значение итогового sMAPE (9,88 %) продемонстрировала модель линейной регрессии.

Для построения системы, которая спрогнозирует коэффициент извлечения золота из руды, рекомендуется использовать обученную модель случайного леса с количеством деревьев 80 и максимальной глубиной одного дерева 2. Значение итогового sMAPE для этой модели на тестовой выборке составляет 7,5 %.